Skip to content

Commit 19295ca

Browse files
committed
Avoid referring to initial$x methods when implementing Scala2 traits
They don't exist for Scala2 traits. Instead we let the initializer be `_' and rely on trait setters (to be implemented) to initialize the field.
1 parent 1d620ff commit 19295ca

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import DenotTransformers._
1414
import StdNames._
1515
import NameOps._
1616
import Phases._
17+
import ast.untpd
1718
import ast.Trees._
1819
import collection.mutable
1920

@@ -150,16 +151,20 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
150151
ctx.atPhase(thisTransform) { implicit ctx => sym is Deferred }
151152

152153
def traitInits(mixin: ClassSymbol): List[Tree] =
153-
for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList)
154-
yield {
155-
// transformFollowing call is needed to make memoize & lazy vals run
156-
val rhs = transformFollowing(superRef(initializer(getter)).appliedToNone)
154+
for (getter <- mixin.info.decls.filter(getr => getr.isGetter && !wasDeferred(getr)).toList) yield {
157155
// isCurrent: getter is a member of implementing class
158156
val isCurrent = getter.is(ExpandedName) || ctx.atPhase(thisTransform) { implicit ctx =>
159157
cls.info.member(getter.name).suchThat(_.isGetter).symbol == getter
160158
}
161-
if (isCurrent) transformFollowing(DefDef(implementation(getter.asTerm), rhs))
162-
else rhs
159+
val isScala2x = mixin.is(Scala2x)
160+
def default = Underscore(getter.info.resultType)
161+
def initial = transformFollowing(superRef(initializer(getter)).appliedToNone)
162+
if (isCurrent)
163+
// transformFollowing call is needed to make memoize & lazy vals run
164+
transformFollowing(
165+
DefDef(implementation(getter.asTerm), if (isScala2x) default else initial))
166+
else if (isScala2x) EmptyTree
167+
else initial
163168
}
164169

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

0 commit comments

Comments
 (0)