aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-24 17:32:27 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-24 17:50:52 +0200
commitbdefca99bc8a7ef6c1d895aecad66b81a18fa9e7 (patch)
tree49e519fb8a9bc45959f00e558e82a9655d0063b7 /src/dotty/tools/dotc/typer
parent412fc2ce472acf8b59dba05ee96d3c09a6bb2d41 (diff)
downloaddotty-bdefca99bc8a7ef6c1d895aecad66b81a18fa9e7.tar.gz
dotty-bdefca99bc8a7ef6c1d895aecad66b81a18fa9e7.tar.bz2
dotty-bdefca99bc8a7ef6c1d895aecad66b81a18fa9e7.zip
Fix context for super calls
Super calls need to have special contexts, going beyond super-mode. It's explained in detail in Context#superCallContext. this(...) calls also need special contexts, but this is not enabled yet (some tests fail, need to track down why).
Diffstat (limited to 'src/dotty/tools/dotc/typer')
-rw-r--r--src/dotty/tools/dotc/typer/Namer.scala2
-rw-r--r--src/dotty/tools/dotc/typer/TypeAssigner.scala12
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala4
3 files changed, 5 insertions, 13 deletions
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala
index 20a5a1204..782faf0d4 100644
--- a/src/dotty/tools/dotc/typer/Namer.scala
+++ b/src/dotty/tools/dotc/typer/Namer.scala
@@ -462,7 +462,7 @@ class Namer { typer: Typer =>
}
def checkedParentType(parent: untpd.Tree): Type = {
- val ptype = parentType(parent)(ctx.fresh addMode Mode.InSuperCall)
+ val ptype = parentType(parent)(ctx.superCallContext)
if (cls.isRefinementClass) ptype
else checkClassTypeWithStablePrefix(ptype, parent.pos, traitReq = parent ne parents.head)
}
diff --git a/src/dotty/tools/dotc/typer/TypeAssigner.scala b/src/dotty/tools/dotc/typer/TypeAssigner.scala
index 50b0fe8c1..7bb6fccc3 100644
--- a/src/dotty/tools/dotc/typer/TypeAssigner.scala
+++ b/src/dotty/tools/dotc/typer/TypeAssigner.scala
@@ -12,20 +12,12 @@ import config.Printers._
trait TypeAssigner {
import tpd._
- /** The enclosing class, except if we are in a super call, in which case
- * it is the next outer one.
- */
- def effectiveEnclosingClass(implicit ctx: Context) = {
- val enclClass = ctx.owner.enclosingClass
- if ((ctx.mode is Mode.InSuperCall) && enclClass.exists) enclClass.owner.enclosingClass
- else enclClass
- }
-
/** The qualifying class of a this or super with prefix `qual` (which might be empty).
* @param packageOk The qualifier may refer to a package.
*/
def qualifyingClass(tree: untpd.Tree, qual: Name, packageOK: Boolean)(implicit ctx: Context): Symbol = {
- effectiveEnclosingClass.ownersIterator.find(o => qual.isEmpty || o.isClass && o.name == qual) match {
+ def qualifies(sym: Symbol) = sym.isClass && (qual.isEmpty || sym.name == qual)
+ ctx.outersIterator.map(_.owner).find(qualifies) match {
case Some(c) if packageOK || !(c is Package) =>
c
case _ =>
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 1cfd03e4c..67c9e15af 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -818,7 +818,8 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
}
def typedClassDef(cdef: untpd.TypeDef, cls: ClassSymbol)(implicit ctx: Context) = track("typedClassDef") {
- val superCtx = ctx.fresh addMode Mode.InSuperCall
+ val TypeDef(mods, name, impl @ Template(constr, parents, self, body)) = cdef
+ val superCtx = ctx.superCallContext
def typedParent(tree: untpd.Tree): Tree =
if (tree.isType) typedType(tree)(superCtx)
else {
@@ -838,7 +839,6 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
else parents
}
- val TypeDef(mods, name, impl @ Template(constr, parents, self, body)) = cdef
val mods1 = addTypedModifiersAnnotations(mods, cls)
val constr1 = typed(constr).asInstanceOf[DefDef]
val parents1 = ensureConstrCall(ensureFirstIsClass(