summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala40
-rw-r--r--test/files/run/names-defaults.scala6
2 files changed, 37 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
index 56625cc939..3009873735 100644
--- a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
@@ -7,8 +7,10 @@
package scala.tools.nsc
package typechecker
+import scala.tools.nsc.util.Position
+import symtab.Flags._
+
import scala.collection.mutable.ListBuffer
- import symtab.Flags._
/**
* @author Lukas Rytz
@@ -132,10 +134,17 @@ trait NamesDefaults { self: Analyzer =>
case TypeRef(pre, sym, args)
if (!args.forall(a => context.undetparams contains a.typeSymbol)) =>
args.map(TypeTree(_))
- case _ => Nil
+ case _ =>
+ Nil
}
(baseFun, Nil, targsInSource)
+ case Select(TypeApply(New(TypeTree()), targs), _) if isConstr =>
+ val targsInSource =
+ if (targs.forall(a => context.undetparams contains a.symbol)) Nil
+ else targs
+ (baseFun, Nil, targsInSource)
+
case _ => (baseFun, Nil, Nil)
}
@@ -170,28 +179,41 @@ trait NamesDefaults { self: Analyzer =>
b
}
+ def moduleQual(pos: Position, tree: Symbol => Tree) = {
+ val module = baseFun.symbol.owner.linkedModuleOfClass
+ if (module == NoSymbol) None
+ else Some(atPos(pos.focus)(tree(module)))
+ }
+
baseFun1 match {
// constructor calls
case Select(New(TypeTree()), _) if isConstr =>
blockWithoutQualifier(None)
+ case Select(TypeApply(New(TypeTree()), _), _) if isConstr =>
+ blockWithoutQualifier(None)
case Select(New(Ident(_)), _) if isConstr =>
blockWithoutQualifier(None)
+ case Select(TypeApply(New(Ident(_)), _), _) if isConstr =>
+ blockWithoutQualifier(None)
- case Select(nev @ New(sel @ Select(qual, typeName)), constr) if isConstr =>
- // #2057
- val module = baseFun.symbol.owner.linkedModuleOfClass
- val defaultQual =
- if (module == NoSymbol) None
- else Some(atPos(qual.pos.focus)(gen.mkAttributedSelect(qual.duplicate, module)))
+ case Select(New(Select(qual, _)), _) if isConstr =>
// in `new q.C()', q is always stable
assert(treeInfo.isPureExpr(qual), qual)
+ // #2057
+ val defaultQual = moduleQual(qual.pos, mod => gen.mkAttributedSelect(qual.duplicate, mod))
+ blockWithoutQualifier(defaultQual)
+
+ case Select(TypeApply(New(Select(qual, _)), _), _) if isConstr =>
+ assert(treeInfo.isPureExpr(qual), qual)
+ val defaultQual = moduleQual(qual.pos, mod => gen.mkAttributedSelect(qual.duplicate, mod))
blockWithoutQualifier(defaultQual)
// super constructor calls
case Select(Super(_, _), _) if isConstr =>
- blockWithoutQualifier(None)
+ val defaultQual = moduleQual(baseFun.pos, mod => gen.mkAttributedRef(mod))
+ blockWithoutQualifier(defaultQual)
// self constructor calls (in secondary constructors)
case Select(qual, name) if isConstr =>
diff --git a/test/files/run/names-defaults.scala b/test/files/run/names-defaults.scala
index 12176105cd..121ddcb3bc 100644
--- a/test/files/run/names-defaults.scala
+++ b/test/files/run/names-defaults.scala
@@ -283,6 +283,12 @@ object Test extends Application {
val one = t f (x = 1)
}
+ // #2820
+ class Test2820 {
+ class A[T](f: String = "ski!")
+ class C extends A
+ }
+
// DEFINITIONS
def test1(a: Int, b: String) = println(a +": "+ b)
def test2(u: Int, v: Int)(k: String, l: Int) = println(l +": "+ k +", "+ (u + v))