aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/ParamForwarding.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2015-09-20 19:24:01 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-09-20 19:24:01 +0100
commit88638199588a4711b383d7de5a00872f26d69cac (patch)
treec3f24d6e455ad1c98108f1a4656ab70749ab722d /src/dotty/tools/dotc/transform/ParamForwarding.scala
parent6bb62102e0542149a3644819fdcfae40ce08ba9e (diff)
downloaddotty-88638199588a4711b383d7de5a00872f26d69cac.tar.gz
dotty-88638199588a4711b383d7de5a00872f26d69cac.tar.bz2
dotty-88638199588a4711b383d7de5a00872f26d69cac.zip
ParamForwarding #783: answer my own question.
Diffstat (limited to 'src/dotty/tools/dotc/transform/ParamForwarding.scala')
-rw-r--r--src/dotty/tools/dotc/transform/ParamForwarding.scala12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/transform/ParamForwarding.scala b/src/dotty/tools/dotc/transform/ParamForwarding.scala
index a10339f85..2e6a97bcf 100644
--- a/src/dotty/tools/dotc/transform/ParamForwarding.scala
+++ b/src/dotty/tools/dotc/transform/ParamForwarding.scala
@@ -33,6 +33,18 @@ class ParamForwarding(thisTransformer: DenotTransformer) {
case _ => (Nil, Nil)
}
def inheritedAccessor(sym: Symbol): Symbol = {
+ /**
+ * Dmitry: having it have the same name is needed to maintain correctness in presence of subclassing
+ * if you would use parent param-name `a` to implement param-field `b`
+ * overriding field `b` will actually override field `a`, that is wrong!
+ *
+ * class A(val s: Int);
+ * class B(val b: Int) extends A(b)
+ * class C extends A(2) {
+ * def s = 3
+ * assert(this.b == 2)
+ * }
+ */
val candidate = sym.owner.asClass.superClass
.info.decl(sym.name).suchThat(_ is (ParamAccessor, butNot = Mutable)).symbol
if (candidate.isAccessibleFrom(currentClass.thisType, superAccess = true)) candidate