@@ -10,6 +10,10 @@ import Symbols._
10
10
import MegaPhase ._
11
11
import Flags ._
12
12
import ValueClasses ._
13
+ import SymUtils ._
14
+ import NameOps ._
15
+ import collection .mutable
16
+
13
17
14
18
/** Performs the following rewritings for fields of a class:
15
19
*
@@ -46,7 +50,7 @@ import ValueClasses._
46
50
* Also, drop the Local flag from all private[this] and protected[this] members.
47
51
* This allows subsequent code motions in Flatten.
48
52
*/
49
- class Getters extends MiniPhase with SymTransformer {
53
+ class Getters extends MiniPhase with SymTransformer { thisPhase =>
50
54
import ast .tpd ._
51
55
52
56
override def phaseName : String = Getters .name
@@ -80,11 +84,31 @@ class Getters extends MiniPhase with SymTransformer {
80
84
}
81
85
private val NoGetterNeededFlags = Method | Param | JavaDefined | JavaStatic
82
86
87
+ val newSetters = mutable.HashSet [Symbol ]()
88
+
89
+ def ensureSetter (sym : TermSymbol )(given Context ) =
90
+ if ! sym.setter.exists then
91
+ newSetters += sym.copy(
92
+ name = sym.name.setterName,
93
+ info = MethodType (sym.info.widenExpr :: Nil , defn.UnitType )
94
+ ).enteredAfter(thisPhase)
95
+
83
96
override def transformValDef (tree : ValDef )(implicit ctx : Context ): Tree =
84
- if (tree.symbol.is(Method )) DefDef (tree.symbol.asTerm, tree.rhs).withSpan(tree.span) else tree
97
+ val sym = tree.symbol
98
+ if ! sym.is(Method ) then return tree
99
+ val getterDef = DefDef (sym.asTerm, tree.rhs).withSpan(tree.span)
100
+ if ! sym.is(Mutable ) then return getterDef
101
+ ensureSetter(sym.asTerm)
102
+ if ! newSetters.contains(sym.setter) then return getterDef
103
+ val setterDef = DefDef (sym.setter.asTerm, unitLiteral)
104
+ Thicket (getterDef, setterDef)
85
105
86
106
override def transformAssign (tree : Assign )(implicit ctx : Context ): Tree =
87
- if (tree.lhs.symbol.is(Method )) tree.lhs.becomes(tree.rhs).withSpan(tree.span) else tree
107
+ val lsym = tree.lhs.symbol.asTerm
108
+ if (lsym.is(Method ))
109
+ ensureSetter(lsym)
110
+ tree.lhs.becomes(tree.rhs).withSpan(tree.span)
111
+ else tree
88
112
}
89
113
90
114
object Getters {
0 commit comments