Skip to content

Commit a0bb466

Browse files
committed
Make Memoize not depend on prepareForDefDef.
I see no good reason for this, as it creates tight coupling between `ifs` in two methods.
1 parent b4b2b85 commit a0bb466

File tree

1 file changed

+7
-15
lines changed

1 file changed

+7
-15
lines changed

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

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,37 +48,29 @@ import Decorators._
4848
case _ =>
4949
}
5050

51-
override def prepareForDefDef(tree: DefDef)(implicit ctx: Context) = {
51+
override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree = {
5252
val sym = tree.symbol
53-
if (sym.isGetter && !sym.is(NoFieldNeeded)) {
53+
lazy val field = {
5454
// allocate field early so that initializer has the right owner for subsequeny phases in
5555
// the group.
5656
val maybeMutable = if (sym is Stable) EmptyFlags else Mutable
57-
val field = ctx.newSymbol(
57+
val field = sym.field.orElse(ctx.newSymbol(
5858
owner = ctx.owner,
5959
name = sym.name.asTermName.fieldName,
6060
flags = Private | maybeMutable,
6161
info = sym.info.resultType,
62-
coord = tree.pos).enteredAfter(thisTransform)
63-
tree.rhs.changeOwnerAfter(sym, field, thisTransform)
64-
}
65-
this
66-
}
62+
coord = tree.pos).enteredAfter(thisTransform))
6763

68-
override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree = {
69-
val sym = tree.symbol
70-
def field = {
71-
val field = sym.field.asTerm
72-
assert(field.exists, i"no field for ${sym.showLocated} in ${sym.owner.info.decls.toList.map{_.showDcl}}%; %")
73-
field
64+
field.asTerm
7465
}
7566
if (sym.is(Accessor, butNot = NoFieldNeeded))
7667
if (sym.isGetter) {
77-
val fieldDef = transformFollowing(ValDef(field, tree.rhs))
68+
val fieldDef = transformFollowing(ValDef(field, tree.rhs.changeOwner(sym, field)))
7869
val getterDef = cpy.DefDef(tree)(rhs = transformFollowingDeep(ref(field)))
7970
Thicket(fieldDef, getterDef)
8071
}
8172
else if (sym.isSetter) {
73+
// @odersky, next line does nothing(except potential MatchError). is this intended?
8274
if (!sym.is(ParamAccessor)) { val Literal(Constant(())) = tree.rhs }
8375
val initializer = Assign(ref(field), ref(tree.vparamss.head.head.symbol))
8476
cpy.DefDef(tree)(rhs = transformFollowingDeep(initializer))

0 commit comments

Comments
 (0)