@@ -5,13 +5,13 @@ import dotty.tools.dotc.ast.{Trees, tpd}
5
5
import scala .collection .mutable
6
6
import ValueClasses .isMethodWithExtension
7
7
import core ._
8
- import Contexts ._ , Flags ._ , Symbols ._ , NameOps ._ , Trees ._ , Types . SuperType
8
+ import Contexts ._ , Flags ._ , Symbols ._ , Names ._ , StdNames ._ , NameOps . _ , Trees . _
9
9
import TypeUtils ._ , SymUtils ._
10
10
import DenotTransformers .DenotTransformer
11
11
import Symbols ._
12
12
import util .Spans ._
13
13
import Decorators ._
14
- import NameKinds .SuperAccessorName
14
+ import NameKinds .{ SuperAccessorName , ExpandPrefixName }
15
15
16
16
/** This class adds super accessors for all super calls that either
17
17
* appear in a trait or have as a target a member of some outer class.
@@ -62,11 +62,12 @@ class SuperAccessors(thisPhase: DenotTransformer) {
62
62
private val accDefs = newMutableSymbolMap[mutable.ListBuffer [Tree ]]
63
63
64
64
/** 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 ) = {
66
66
val Select (qual, name) = sel
67
67
val sym = sel.symbol
68
68
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)
70
71
if (clazz.is(Trait )) superName = superName.expandedName(clazz)
71
72
val superInfo = sel.tpe.widenSingleton.ensureMethodic
72
73
@@ -147,19 +148,14 @@ class SuperAccessors(thisPhase: DenotTransformer) {
147
148
}
148
149
}
149
150
150
- def mixIsTrait = sup.tpe match {
151
- case SuperType (thisTpe, superTpe) => superTpe.typeSymbol.is(Trait )
152
- }
153
-
154
151
val needAccessor = name.isTermName && {
155
152
mix.name.isEmpty && (clazz.is(Trait ) || clazz != currentClass || ! validCurrentClass) ||
156
153
// 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)
160
156
}
161
157
162
- if (needAccessor) atPhase(thisPhase.next)(superAccessorCall(sel))
158
+ if (needAccessor) atPhase(thisPhase.next)(superAccessorCall(sel, mix.name ))
163
159
else sel
164
160
}
165
161
0 commit comments