@@ -193,29 +193,32 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
193
193
ctx.error(i " parameterized $mixin $msg" , pos)
194
194
EmptyTree
195
195
}
196
+
196
197
for (getter <- mixin.info.decls.filter(getr => getr.isGetter && ! wasDeferred(getr)).toList) yield {
197
198
val isScala2x = mixin.is(Scala2x )
198
199
def default = Underscore (getter.info.resultType)
199
200
def initial = transformFollowing(superRef(initializer(getter)).appliedToNone)
201
+
202
+ /** A call to the implementation of `getter` in `mixin`'s implementation class */
203
+ def lazyGetterCall = {
204
+ def canbeImplClassGetter (sym : Symbol ) = sym.info.firstParamTypes match {
205
+ case t :: Nil => t.isDirectRef(mixin)
206
+ case _ => false
207
+ }
208
+ val implClassGetter = mixin.implClass.info.nonPrivateDecl(getter.name)
209
+ .suchThat(canbeImplClassGetter).symbol
210
+ ref(mixin.implClass).select(implClassGetter).appliedTo(This (cls))
211
+ }
212
+
200
213
if (isCurrent(getter) || getter.is(ExpandedName )) {
201
214
val rhs =
202
215
if (ctx.atPhase(thisTransform)(implicit ctx => getter.is(ParamAccessor ))) nextArgument()
203
- else if (isScala2x) Underscore (getter.info.resultType)
216
+ else if (isScala2x)
217
+ if (getter.is(Lazy )) lazyGetterCall
218
+ else Underscore (getter.info.resultType)
204
219
else transformFollowing(superRef(initializer(getter)).appliedToNone)
205
220
// transformFollowing call is needed to make memoize & lazy vals run
206
- transformFollowing(
207
- DefDef (implementation(getter.asTerm),
208
- if (isScala2x) {
209
- if (getter.is(Flags .Lazy )) { // lazy vals need to have a rhs that will be the lazy initializer
210
- val sym = mixin.implClass.info.nonPrivateDecl(getter.name).suchThat(_.info.paramTypess match {
211
- case List (List (t : TypeRef )) => t.isDirectRef(mixin)
212
- case _ => false
213
- }).symbol // lazy val can be overloaded
214
- ref(mixin.implClass).select(sym).appliedTo(This (ctx.owner.asClass))
215
- }
216
- else default
217
- } else initial)
218
- )
221
+ transformFollowing(DefDef (implementation(getter.asTerm), rhs))
219
222
}
220
223
else if (isScala2x) EmptyTree
221
224
else initial
0 commit comments