@@ -84,14 +84,19 @@ class ExplicitOuter extends MiniPhaseTransform with InfoTransformer { thisTransf
84
84
newDefs += ValDef (outerParamAcc, EmptyTree )
85
85
newDefs += DefDef (outerAccessor(cls).asTerm, ref(outerParamAcc))
86
86
}
87
+
88
+ for (parentTrait <- cls.mixins) {
89
+ if (needsOuterIfReferenced(parentTrait)) {
90
+ val parentTp = cls.denot.thisType.baseTypeRef(parentTrait)
91
+ val outerAccImpl = newOuterAccessor(cls, parentTrait).enteredAfter(thisTransformer)
92
+ newDefs += DefDef (outerAccImpl, singleton(outerPrefix(parentTp)))
93
+ }
94
+ }
95
+
87
96
val parents1 =
88
97
for (parent <- impl.parents) yield {
89
98
val parentCls = parent.tpe.classSymbol.asClass
90
99
if (parentCls.is(Trait )) {
91
- if (needsOuterIfReferenced(parentCls)) {
92
- val outerAccImpl = newOuterAccessor(cls, parentCls).enteredAfter(thisTransformer)
93
- newDefs += DefDef (outerAccImpl, singleton(outerPrefix(parent.tpe)))
94
- }
95
100
parent
96
101
}
97
102
else parent match { // ensure class parent is a constructor
@@ -145,7 +150,7 @@ object ExplicitOuter {
145
150
146
151
/** A new outer accessor for class `cls` which is a member of `owner` */
147
152
private def newOuterAccessor (owner : ClassSymbol , cls : ClassSymbol )(implicit ctx : Context ) = {
148
- val deferredIfTrait = if (cls .is(Trait )) Deferred else EmptyFlags
153
+ val deferredIfTrait = if (owner .is(Trait )) Deferred else EmptyFlags
149
154
val outerAccIfOwn = if (owner == cls) OuterAccessor else EmptyFlags
150
155
newOuterSym(owner, cls, outerAccName(cls),
151
156
Final | Method | Stable | outerAccIfOwn | deferredIfTrait)
0 commit comments