diff options
author | Martin Odersky <odersky@gmail.com> | 2007-01-25 15:50:26 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2007-01-25 15:50:26 +0000 |
commit | 803488f3e2e1074c373cac55d8d4c08ac4a07eb9 (patch) | |
tree | 568687a91e8cf3c65c917cebc1b14a5573fb1570 /src/compiler | |
parent | 44d630b0ced6d101a43955bd0755d098d6e613b2 (diff) | |
download | scala-803488f3e2e1074c373cac55d8d4c08ac4a07eb9.tar.gz scala-803488f3e2e1074c373cac55d8d4c08ac4a07eb9.tar.bz2 scala-803488f3e2e1074c373cac55d8d4c08ac4a07eb9.zip |
1.
2. More detailed error messages for ambiguous implicits. 3. Relaxed
rules for necessary overlap in pattern matching
Diffstat (limited to 'src/compiler')
4 files changed, 25 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeInfo.scala b/src/compiler/scala/tools/nsc/ast/TreeInfo.scala index 5b4622a984..13980856ec 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeInfo.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeInfo.scala @@ -225,4 +225,19 @@ abstract class TreeInfo { case AppliedTypeTree(fn, _) => methPart(fn) case _ => tree } + + /** Top-level definition sequence contains a leading import of Predef or scala.Predef + */ + def containsLeadingPredefImport(defs: List[Tree]): boolean = defs match { + case List(PackageDef(_, defs1)) => + containsLeadingPredefImport(defs1) + case Import(Ident(nme.Predef), _) :: _ => + true + case Import(Select(Ident(nme.scala_), nme.Predef), _) :: _ => + true + case Import(_, _) :: defs1 => + containsLeadingPredefImport(defs1) + case _ => + false + } } diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala index 2e4742e94c..a77098a50f 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala @@ -51,7 +51,7 @@ trait Contexts requires Analyzer { addImport(JavaLangPackage) assert(ScalaPackage ne null, "Scala package is null") addImport(ScalaPackage) - if (!settings.nopredefs.value/* || unit.source.file.name != "Predef.scala"*/) + if (!(settings.nopredefs.value || treeInfo.containsLeadingPredefImport(List(unit.body)))) addImport(PredefModule) } val c = sc.make(unit, tree, sc.owner, sc.scope, sc.imports) diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala index 983e72c75f..589e36b5d3 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala @@ -915,6 +915,13 @@ trait Infer requires Analyzer { } } + object approximateAbstracts extends TypeMap { + def apply(tp: Type): Type = tp match { + case TypeRef(pre, sym, _) if sym.isAbstractType => WildcardType + case _ => mapOver(tp) + } + } + /** A traverser to collect type parameters referred to in a type */ object freeTypeParamsOfTerms extends SymCollector { diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 6c5462196a..3b3c02ce5b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -630,7 +630,8 @@ trait Typers requires Analyzer { if ((mode & PATTERNmode) != 0) { if ((tree.symbol ne null) && tree.symbol.isModule) inferModulePattern(tree, pt) - if (isPopulated(tree.tpe, pt)) return tree + if (isPopulated(tree.tpe, approximateAbstracts(pt))) + return tree } val tree1 = constfold(tree, pt) // (10) (11) if (tree1.tpe <:< pt) adapt(tree1, mode, pt) |