@@ -5,13 +5,13 @@ import dotty.tools.dotc.ast.{Trees, tpd}
55import scala .collection .mutable
66import ValueClasses .isMethodWithExtension
77import core ._
8- import Contexts ._ , Flags ._ , Symbols ._ , NameOps ._ , Trees ._ , Types . SuperType
8+ import Contexts ._ , Flags ._ , Symbols ._ , Names ._ , StdNames ._ , NameOps . _ , Trees . _
99import TypeUtils ._ , SymUtils ._
1010import DenotTransformers .DenotTransformer
1111import Symbols ._
1212import util .Spans ._
1313import Decorators ._
14- import NameKinds .SuperAccessorName
14+ import NameKinds .{ SuperAccessorName , ExpandPrefixName }
1515
1616/** This class adds super accessors for all super calls that either
1717 * appear in a trait or have as a target a member of some outer class.
@@ -62,11 +62,12 @@ class SuperAccessors(thisPhase: DenotTransformer) {
6262 private val accDefs = newMutableSymbolMap[mutable.ListBuffer [Tree ]]
6363
6464 /** A super accessor call corresponding to `sel` */
65- private def superAccessorCall (sel : Select )(using Context ) = {
65+ private def superAccessorCall (sel : Select , mixName : Name = nme. EMPTY )(using Context ) = {
6666 val Select (qual, name) = sel
6767 val sym = sel.symbol
6868 val clazz = qual.symbol.asClass
69- var superName = SuperAccessorName (name.asTermName)
69+ val preName = if (mixName.isEmpty) name.toTermName else ExpandPrefixName (name.toTermName, mixName.toTermName)
70+ var superName = SuperAccessorName (preName)
7071 if (clazz.is(Trait )) superName = superName.expandedName(clazz)
7172 val superInfo = sel.tpe.widenSingleton.ensureMethodic
7273
@@ -147,19 +148,14 @@ class SuperAccessors(thisPhase: DenotTransformer) {
147148 }
148149 }
149150
150- def mixIsTrait = sup.tpe match {
151- case SuperType (thisTpe, superTpe) => superTpe.typeSymbol.is(Trait )
152- }
153-
154151 val needAccessor = name.isTermName && {
155152 mix.name.isEmpty && (clazz.is(Trait ) || clazz != currentClass || ! validCurrentClass) ||
156153 // SI-8803. If we access super[A] from an inner class (!= currentClass) or closure (validCurrentClass),
157- // where A is the superclass we need an accessor. If A is a parent trait we don't: in this case mixin
158- // will re-route the super call directly to the impl class (it's statically known).
159- ! mix.name.isEmpty && (clazz != currentClass || ! validCurrentClass) && ! mixIsTrait
154+ // where A is the superclass we need an accessor.
155+ ! mix.name.isEmpty && (clazz != currentClass || ! validCurrentClass)
160156 }
161157
162- if (needAccessor) atPhase(thisPhase.next)(superAccessorCall(sel))
158+ if (needAccessor) atPhase(thisPhase.next)(superAccessorCall(sel, mix.name ))
163159 else sel
164160 }
165161
0 commit comments