aboutsummaryrefslogtreecommitdiff
path: root/compiler/src
diff options
context:
space:
mode:
authorGuillaume Martres <smarter@ubuntu.com>2017-03-20 19:30:22 +0100
committerGitHub <noreply@github.com>2017-03-20 19:30:22 +0100
commitf009dc0d6d7d93a378da3411bd41bbcb29428db5 (patch)
treef169d43ec7dce7037958d46850a3cb054f4ba3e0 /compiler/src
parentf45dbe7e3722f0c6a814c8afd8481690ac5f1d2c (diff)
parent40a3b94fd8380c120634742239c5128e3fce664c (diff)
downloaddotty-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.scala12
-rw-r--r--compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala11
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))