diff options
author | Martin Odersky <odersky@gmail.com> | 2014-08-24 17:32:27 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-08-24 17:50:52 +0200 |
commit | bdefca99bc8a7ef6c1d895aecad66b81a18fa9e7 (patch) | |
tree | 49e519fb8a9bc45959f00e558e82a9655d0063b7 /src/dotty/tools/dotc/typer | |
parent | 412fc2ce472acf8b59dba05ee96d3c09a6bb2d41 (diff) | |
download | dotty-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.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/TypeAssigner.scala | 12 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Typer.scala | 4 |
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( |