diff options
author | Guillaume Martres <smarter@ubuntu.com> | 2017-03-20 19:30:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-20 19:30:22 +0100 |
commit | f009dc0d6d7d93a378da3411bd41bbcb29428db5 (patch) | |
tree | f169d43ec7dce7037958d46850a3cb054f4ba3e0 /compiler/src | |
parent | f45dbe7e3722f0c6a814c8afd8481690ac5f1d2c (diff) | |
parent | 40a3b94fd8380c120634742239c5128e3fce664c (diff) | |
download | dotty-f009dc0d6d7d93a378da3411bd41bbcb29428db5.tar.gz dotty-f009dc0d6d7d93a378da3411bd41bbcb29428db5.tar.bz2 dotty-f009dc0d6d7d93a378da3411bd41bbcb29428db5.zip |
Merge pull request #2124 from dotty-staging/fix-param-fwd
Fix parameter accessor forwarding
Diffstat (limited to 'compiler/src')
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/Types.scala | 12 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala | 11 |
2 files changed, 17 insertions, 6 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/Types.scala b/compiler/src/dotty/tools/dotc/core/Types.scala index 6c27e53f6..c80107f93 100644 --- a/compiler/src/dotty/tools/dotc/core/Types.scala +++ b/compiler/src/dotty/tools/dotc/core/Types.scala @@ -1719,7 +1719,7 @@ object Types { * under both private and public names, so it could still be found by looking up * the public name. */ - final def shadowed(implicit ctx: Context): NamedType = + def shadowed(implicit ctx: Context): NamedType = NamedType(prefix, name.shadowedName) override def equals(that: Any) = that match { @@ -1782,15 +1782,19 @@ object Types { else d.atSignature(sig).checkUnique } - override def newLikeThis(prefix: Type)(implicit ctx: Context): TermRef = { - val candidate = TermRef.withSig(prefix, name, sig) + private def fixDenot(candidate: TermRef, prefix: Type)(implicit ctx: Context): TermRef = if (symbol.exists && !candidate.symbol.exists) { // recompute from previous symbol val ownSym = symbol val newd = asMemberOf(prefix, allowPrivate = ownSym.is(Private)) candidate.withDenot(newd.suchThat(_.signature == ownSym.signature)) } else candidate - } + + override def newLikeThis(prefix: Type)(implicit ctx: Context): TermRef = + fixDenot(TermRef.withSig(prefix, name, sig), prefix) + + override def shadowed(implicit ctx: Context): NamedType = + fixDenot(TermRef.withSig(prefix, name.shadowedName, sig), prefix) override def equals(that: Any) = that match { case that: TermRefWithSignature => diff --git a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala index 859ac8b06..2836ebcfe 100644 --- a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala +++ b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala @@ -4,6 +4,8 @@ package transform import core._ import ast.Trees._ import Contexts._, Types._, Symbols._, Flags._, TypeUtils._, DenotTransformers._, StdNames._ +import Decorators._ +import config.Printers.typr /** For all parameter accessors * @@ -48,7 +50,7 @@ class ParamForwarding(thisTransformer: DenotTransformer) { val candidate = sym.owner.asClass.superClass .info.decl(sym.name).suchThat(_ is (ParamAccessor, butNot = Mutable)).symbol if (candidate.isAccessibleFrom(currentClass.thisType, superAccess = true)) candidate - else if (candidate is Method) inheritedAccessor(candidate) + else if (candidate.exists) inheritedAccessor(candidate) else NoSymbol } def forwardParamAccessor(stat: Tree): Tree = { @@ -65,8 +67,13 @@ class ParamForwarding(thisTransformer: DenotTransformer) { def forwarder(implicit ctx: Context) = { sym.copySymDenotation(initFlags = sym.flags | Method | Stable, info = sym.info.ensureMethodic) .installAfter(thisTransformer) - val superAcc = + var superAcc = Super(This(currentClass), tpnme.EMPTY, inConstrCall = false).select(alias) + if (alias.owner != currentClass.superClass) + // need to use shadowed in order not to accidentally address an + // intervening private forwarder in the superclass + superAcc = superAcc.withType(superAcc.tpe.asInstanceOf[TermRef].shadowed) + typr.println(i"adding param forwarder $superAcc") DefDef(sym, superAcc.ensureConforms(sym.info.widen)) } return forwarder(ctx.withPhase(thisTransformer.next)) |