summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeInfo.scala15
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala7
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala3
-rw-r--r--src/library/scala/Stream.scala2
5 files changed, 26 insertions, 3 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)
diff --git a/src/library/scala/Stream.scala b/src/library/scala/Stream.scala
index e42947512b..6ecc9b768c 100644
--- a/src/library/scala/Stream.scala
+++ b/src/library/scala/Stream.scala
@@ -192,7 +192,7 @@ trait Stream[+a] extends Seq[a] {
*/
def elements: Iterator[a] = new Iterator[a] {
var current = Stream.this
- def hasNext: boolean = !current.isEmpty
+ def hasNext: Boolean = !current.isEmpty
def next: a = { val result = current.head; current = current.tail; result }
}