summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2009-12-21 11:20:43 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2009-12-21 11:20:43 +0000
commite7e0d49dea014dfa21061bc5b5520b88aea23794 (patch)
treef1d8718a108391515c70ef7d8014ef408c9047f5 /src/compiler
parent691bc541908512f5b8afb10b71b1f090661f9422 (diff)
downloadscala-e7e0d49dea014dfa21061bc5b5520b88aea23794.tar.gz
scala-e7e0d49dea014dfa21061bc5b5520b88aea23794.tar.bz2
scala-e7e0d49dea014dfa21061bc5b5520b88aea23794.zip
close #2820
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala40
1 files changed, 31 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 =>