From 027be966ac92e04beec1287eeb723eee4975c62e Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 24 Aug 2016 13:39:52 +0200 Subject: [PATCH] Fix handling of superCalls. 1. There may be calls to super on non-this. 2. there may be calls to in-dirrect super-traits. --- src/dotty/tools/backend/jvm/CollectSuperCalls.scala | 7 +++++-- src/dotty/tools/backend/jvm/DottyBackendInterface.scala | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/dotty/tools/backend/jvm/CollectSuperCalls.scala b/src/dotty/tools/backend/jvm/CollectSuperCalls.scala index 8f9b067ba7ac..e504047f3fb9 100644 --- a/src/dotty/tools/backend/jvm/CollectSuperCalls.scala +++ b/src/dotty/tools/backend/jvm/CollectSuperCalls.scala @@ -20,8 +20,11 @@ class CollectSuperCalls extends MiniPhaseTransform { 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 + case Super(qual, mix) if mix.nonEmpty => + val classSymbol: ClassSymbol = qual match { + case qual: This => qual.symbol.asClass.classSymbol + case qual => qual.symbol.info.classSymbol.asClass + } registerSuperCall(classSymbol, tree.symbol.owner.asClass) case _ => } diff --git a/src/dotty/tools/backend/jvm/DottyBackendInterface.scala b/src/dotty/tools/backend/jvm/DottyBackendInterface.scala index 30934605bd21..34bcd0757cef 100644 --- a/src/dotty/tools/backend/jvm/DottyBackendInterface.scala +++ b/src/dotty/tools/backend/jvm/DottyBackendInterface.scala @@ -747,9 +747,13 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma */ def superInterfaces: List[Symbol] = { val directlyInheritedTraits = decorateSymbol(sym).directlyInheritedTraits + val directlyInheritedTraitsSet = directlyInheritedTraits.toSet val allBaseClasses = directlyInheritedTraits.iterator.flatMap(_.symbol.asClass.baseClasses.drop(1)).toSet val superCalls = superCallsMap.getOrElse(sym, Set.empty) - directlyInheritedTraits.filter(t => !allBaseClasses(t) || superCalls(t)) + val additional = (superCalls -- directlyInheritedTraitsSet).filter(_.is(Flags.Trait)) +// if (additional.nonEmpty) +// println(s"$fullName: adding supertraits $additional") + directlyInheritedTraits.filter(t => !allBaseClasses(t) || superCalls(t)) ++ additional } /**