diff options
author | Martin Odersky <odersky@gmail.com> | 2016-12-18 20:00:00 +0100 |
---|---|---|
committer | Felix Mulder <felix.mulder@gmail.com> | 2016-12-20 18:33:44 +0100 |
commit | d9f66a2d3a781bb2538a3e4569f8af245f3374d4 (patch) | |
tree | ad8989af612e01912c4ae35c6d3d7ea0a85bf96e /compiler/src/dotty/tools/dotc/transform | |
parent | 7c5e36b80e111d17910dbf122c02a458377656d1 (diff) | |
download | dotty-d9f66a2d3a781bb2538a3e4569f8af245f3374d4.tar.gz dotty-d9f66a2d3a781bb2538a3e4569f8af245f3374d4.tar.bz2 dotty-d9f66a2d3a781bb2538a3e4569f8af245f3374d4.zip |
Fix super accessor generation
We looked under the wrong signature before, which meant that
we sometimes would not detect that a super accessor existed
already and generate a duplicate. Observed when compiling
stdlib's collection/mutable/ObservableMap.scala.
Diffstat (limited to 'compiler/src/dotty/tools/dotc/transform')
-rw-r--r-- | compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala index fea478c9b..3c11827fc 100644 --- a/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala +++ b/compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala @@ -71,21 +71,24 @@ class SuperAccessors(thisTransformer: DenotTransformer) { val Select(qual, name) = sel val sym = sel.symbol val clazz = qual.symbol.asClass - var supername = name.superName - if (clazz is Trait) supername = supername.expandedName(clazz) - - val superAcc = clazz.info.decl(supername).suchThat(_.signature == sym.signature).symbol orElse { - ctx.debuglog(s"add super acc ${sym.showLocated} to $clazz") - val deferredOrPrivate = if (clazz is Trait) Deferred | ExpandedName else Private - val acc = ctx.newSymbol( - clazz, supername, SuperAccessor | Artifact | Method | deferredOrPrivate, - sel.tpe.widenSingleton.ensureMethodic, coord = sym.coord).enteredAfter(thisTransformer) - // Diagnostic for SI-7091 - if (!accDefs.contains(clazz)) - ctx.error(s"Internal error: unable to store accessor definition in ${clazz}. clazz.hasPackageFlag=${clazz is Package}. Accessor required for ${sel} (${sel.show})", sel.pos) - else accDefs(clazz) += DefDef(acc, EmptyTree) - acc - } + var superName = name.superName + if (clazz is Trait) superName = superName.expandedName(clazz) + val superInfo = sel.tpe.widenSingleton.ensureMethodic + + val superAcc = clazz.info.decl(superName) + .suchThat(_.signature == superInfo.signature).symbol + .orElse { + ctx.debuglog(s"add super acc ${sym.showLocated} to $clazz") + val deferredOrPrivate = if (clazz is Trait) Deferred | ExpandedName else Private + val acc = ctx.newSymbol( + clazz, superName, SuperAccessor | Artifact | Method | deferredOrPrivate, + superInfo, coord = sym.coord).enteredAfter(thisTransformer) + // Diagnostic for SI-7091 + if (!accDefs.contains(clazz)) + ctx.error(s"Internal error: unable to store accessor definition in ${clazz}. clazz.hasPackageFlag=${clazz is Package}. Accessor required for ${sel} (${sel.show})", sel.pos) + else accDefs(clazz) += DefDef(acc, EmptyTree) + acc + } This(clazz).select(superAcc).withPos(sel.pos) } |