aboutsummaryrefslogtreecommitdiff
path: root/compiler/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-12-18 20:00:00 +0100
committerFelix Mulder <felix.mulder@gmail.com>2016-12-20 18:33:44 +0100
commitd9f66a2d3a781bb2538a3e4569f8af245f3374d4 (patch)
treead8989af612e01912c4ae35c6d3d7ea0a85bf96e /compiler/src
parent7c5e36b80e111d17910dbf122c02a458377656d1 (diff)
downloaddotty-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')
-rw-r--r--compiler/src/dotty/tools/dotc/transform/SuperAccessors.scala33
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)
}