@@ -37,28 +37,40 @@ import Decorators._
37
37
override def phaseName = " memoize"
38
38
override def treeTransformPhase = thisTransform.next
39
39
40
+ override def prepareForDefDef (tree : DefDef )(implicit ctx : Context ) = {
41
+ val sym = tree.symbol
42
+ if (sym.isGetter && ! sym.is(NoFieldNeeded )) {
43
+ // allocate field early so that initializer has the right owner for subsequeny phases in
44
+ // the group.
45
+ val maybeMutable = if (sym is Stable ) EmptyFlags else Mutable
46
+ val field = ctx.newSymbol(
47
+ owner = ctx.owner,
48
+ name = sym.name.asTermName.fieldName,
49
+ flags = Private | maybeMutable,
50
+ info = sym.info.resultType,
51
+ coord = tree.pos).enteredAfter(thisTransform)
52
+ tree.rhs.changeOwnerAfter(sym, field, thisTransform)
53
+ }
54
+ this
55
+ }
56
+
40
57
override def transformDefDef (tree : DefDef )(implicit ctx : Context , info : TransformerInfo ): Tree = {
41
58
val sym = tree.symbol
59
+ def field = {
60
+ val field = sym.field.asTerm
61
+ assert(field.exists, i " no field for ${sym.showLocated} in ${sym.owner.info.decls.toList.map{_.showDcl}}%; % " )
62
+ field
63
+ }
42
64
if (sym.is(Accessor , butNot = NoFieldNeeded ))
43
65
if (sym.isGetter) {
44
- val maybeMutable = if (sym is Stable ) EmptyFlags else Mutable
45
- println(i " add field for $sym" )
46
- val field = ctx.newSymbol(
47
- owner = ctx.owner,
48
- name = sym.name.asTermName.fieldName,
49
- flags = Private | maybeMutable,
50
- info = sym.info.resultType,
51
- coord = tree.pos).enteredAfter(thisTransform)
52
- var fieldInit = tree.rhs.changeOwner(sym, field)
53
- val fieldDef = ValDef (field, fieldInit)
54
- val getterDef = cpy.DefDef (tree)(rhs = ref(field))
66
+ val fieldDef = transformFollowing(ValDef (field, tree.rhs))
67
+ val getterDef = cpy.DefDef (tree)(rhs = transformFollowingDeep(ref(field)))
55
68
Thicket (fieldDef, getterDef)
56
69
}
57
70
else if (sym.isSetter) {
58
71
val Literal (Constant (())) = tree.rhs
59
- assert(sym.field.exists, i " no field for ${sym.showLocated} in ${sym.owner.info.decls.toList.map{_.showDcl}}%; % " )
60
- val initializer = Assign (ref(sym.field), ref(tree.vparamss.head.head.symbol))
61
- cpy.DefDef (tree)(rhs = initializer)
72
+ val initializer = Assign (ref(field), ref(tree.vparamss.head.head.symbol))
73
+ cpy.DefDef (tree)(rhs = transformFollowingDeep(initializer))
62
74
}
63
75
else tree // curiously, some accessors from Scala2 have ' ' suffixes. They count as
64
76
// neither getters nor setters
0 commit comments