diff options
-rw-r--r-- | src/dotty/tools/backend/jvm/CollectSuperCalls.scala | 15 | ||||
-rw-r--r-- | tests/run/i1423.check | 5 | ||||
-rw-r--r-- | tests/run/i1423.scala | 20 |
3 files changed, 33 insertions, 7 deletions
diff --git a/src/dotty/tools/backend/jvm/CollectSuperCalls.scala b/src/dotty/tools/backend/jvm/CollectSuperCalls.scala index d19228364..8f9b067ba 100644 --- a/src/dotty/tools/backend/jvm/CollectSuperCalls.scala +++ b/src/dotty/tools/backend/jvm/CollectSuperCalls.scala @@ -1,7 +1,7 @@ package dotty.tools.backend.jvm -import dotty.tools.dotc.ast.tpd._ -import dotty.tools.dotc.ast.Trees +import dotty.tools.dotc.ast.tpd +import dotty.tools.dotc.ast.Trees._ import dotty.tools.dotc.core.Contexts.Context import dotty.tools.dotc.core.Symbols._ import dotty.tools.dotc.transform.TreeTransforms.{MiniPhaseTransform, TransformerInfo} @@ -14,17 +14,18 @@ import dotty.tools.dotc.transform.TreeTransforms.{MiniPhaseTransform, Transforme * the redundant mixin class could be required as a parent by the JVM. */ class CollectSuperCalls extends MiniPhaseTransform { + import tpd._ def phaseName: String = "collectSuperCalls" - override def transformSuper(tree: Super)(implicit ctx: Context, info: TransformerInfo): Tree = { - tree match { - case Trees.Super(qual: This, mix) if mix.nonEmpty => + override def transformSelect(tree: Select)(implicit ctx: Context, info: TransformerInfo): Tree = { + tree.qualifier match { + case Super(qual: This, mix) if mix.nonEmpty => val classSymbol = qual.symbol.asClass.classSymbol - registerSuperCall(classSymbol, tree.tpe.baseClasses.head) + registerSuperCall(classSymbol, tree.symbol.owner.asClass) case _ => } - super.transformSuper(tree) + tree } private def registerSuperCall(sym: ClassSymbol, calls: ClassSymbol)(implicit ctx: Context) = { diff --git a/tests/run/i1423.check b/tests/run/i1423.check new file mode 100644 index 000000000..a6a795856 --- /dev/null +++ b/tests/run/i1423.check @@ -0,0 +1,5 @@ +3 +2 +3 +1 +0 diff --git a/tests/run/i1423.scala b/tests/run/i1423.scala new file mode 100644 index 000000000..a7091c114 --- /dev/null +++ b/tests/run/i1423.scala @@ -0,0 +1,20 @@ +class B { def m: Int = 0 } +class C extends B { override def m = 4 } +trait T1 extends B { override def m = 1 } +trait T2 extends T1 { override def m = 2 } +trait T3 extends T1 { override def m = 3 } + +trait T4 extends T1 +class D extends B { + def f() = println(super[B].m) +} + +object Test extends C with T2 with T3 with T4 { + def main(args: Array[String]): Unit = { + println(m) + println(super[T2].m) + println(super[T3].m) + println(super[T4].m) + new D().f() + } +} |