Skip to content

Commit c366cf9

Browse files
oderskyDarkDimius
authored andcommitted
Mixin: generate a getter in implementing class only if current
A class might implement several fields in inherited traits with the same and type. In that case only one getter should be produced, but all initializing expressions have to be executed.
1 parent da37cca commit c366cf9

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

src/dotty/tools/dotc/transform/Memoize.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,15 @@ import Decorators._
5050

5151
override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree = {
5252
val sym = tree.symbol
53-
53+
5454
def newField = ctx.newSymbol(
5555
owner = ctx.owner,
5656
name = sym.name.asTermName.fieldName,
5757
flags = Private | (if (sym is Stable) EmptyFlags else Mutable),
5858
info = sym.info.resultType,
5959
coord = tree.pos).enteredAfter(thisTransform)
60-
61-
lazy val field = sym.field.orElse(newField).asTerm
60+
61+
lazy val field = sym.field.orElse(newField).asTerm
6262
if (sym.is(Accessor, butNot = NoFieldNeeded))
6363
if (sym.isGetter) {
6464
tree.rhs.changeOwnerAfter(sym, field, thisTransform)

src/dotty/tools/dotc/transform/Mixin.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,12 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
153153
for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList)
154154
yield {
155155
// transformFollowing call is needed to make memoize & lazy vals run
156-
transformFollowing(DefDef(implementation(getter.asTerm), superRef(initializer(getter)).appliedToNone))
156+
val rhs = transformFollowing(superRef(initializer(getter)).appliedToNone)
157+
val isCurrent = ctx.atPhase(thisTransform) { implicit ctx =>
158+
cls.info.member(getter.name).suchThat(_.isGetter).symbol == getter
159+
}
160+
if (isCurrent) transformFollowing(DefDef(implementation(getter.asTerm), rhs))
161+
else rhs
157162
}
158163

159164
def setters(mixin: ClassSymbol): List[Tree] =

0 commit comments

Comments
 (0)