@@ -40,6 +40,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
40
40
sym == defn.JavaEnumClass .primaryConstructor ||
41
41
sym.owner.derivesFromJavaEnum))
42
42
addConstrParams(sym.info)
43
+ else if isJavaEnumValueImpl(sym) then
44
+ sym.asClass.delete(tp.decl(nme.toString_).symbol)
45
+ sym.asClass.delete(tp.decl(nme.ordinalDollar).symbol)
46
+ tp
43
47
else tp
44
48
45
49
/** Add constructor parameters `$name: String` and `$ordinal: Int` to the end of
@@ -62,9 +66,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
62
66
/** The list of parameter definitions `$name: String, $ordinal: Int`, in given `owner`
63
67
* with given flags (either `Param` or `ParamAccessor`)
64
68
*/
65
- private def addedParams (owner : Symbol , flag : FlagSet )(using Context ): List [ValDef ] = {
66
- val nameParam = newSymbol(owner, nameParamName, flag | Synthetic , defn.StringType , coord = owner.span)
67
- val ordinalParam = newSymbol(owner, ordinalParamName, flag | Synthetic , defn.IntType , coord = owner.span)
69
+ private def addedParams (owner : Symbol , isLocal : Boolean , flag : FlagSet )(using Context ): List [ValDef ] = {
70
+ val flags = flag | Synthetic | (if isLocal then Private | Deferred else EmptyFlags )
71
+ val nameParam = newSymbol(owner, nameParamName, flags, defn.StringType , coord = owner.span)
72
+ val ordinalParam = newSymbol(owner, ordinalParamName, flags, defn.IntType , coord = owner.span)
68
73
List (ValDef (nameParam), ValDef (ordinalParam))
69
74
}
70
75
@@ -85,7 +90,7 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
85
90
val sym = tree.symbol
86
91
if (sym.isConstructor && sym.owner.derivesFromJavaEnum)
87
92
val tree1 = cpy.DefDef (tree)(
88
- vparamss = tree.vparamss.init :+ (tree.vparamss.last ++ addedParams(sym, Param )))
93
+ vparamss = tree.vparamss.init :+ (tree.vparamss.last ++ addedParams(sym, isLocal = false , Param )))
89
94
sym.setParamssFromDefs(tree1.tparams, tree1.vparamss)
90
95
tree1
91
96
else tree
@@ -107,6 +112,11 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
107
112
}
108
113
}
109
114
115
+ private def isJavaEnumValueImpl (cls : Symbol )(using Context ): Boolean =
116
+ cls.isAnonymousClass
117
+ && ((cls.owner.name eq nme.DOLLAR_NEW ) || cls.owner.isAllOf(EnumCase ))
118
+ && cls.owner.owner.linkedClass.derivesFromJavaEnum
119
+
110
120
/** 1. If this is an enum class, add $name and $ordinal parameters to its
111
121
* parameter accessors and pass them on to the java.lang.Enum constructor.
112
122
*
@@ -116,38 +126,39 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
116
126
*
117
127
* class $anon extends E(...) {
118
128
* ...
119
- * def ordinal = N
120
- * def toString = S
129
+ * private def $ ordinal = N
130
+ * override def toString = S
121
131
* ...
122
132
* }
123
133
*
124
134
* After the transform it is expanded to
125
135
*
126
136
* class $anon extends E(..., N, S) {
127
- * "same as before"
137
+ * ...
138
+ * "removed $ordinal and toString"
139
+ * ...
128
140
* }
129
141
*/
130
142
override def transformTemplate (templ : Template )(using Context ): Template = {
131
143
val cls = templ.symbol.owner
132
- if ( cls.derivesFromJavaEnum) {
144
+ if cls.derivesFromJavaEnum then
133
145
val (params, rest) = decomposeTemplateBody(templ.body)
134
- val addedDefs = addedParams(cls, ParamAccessor )
146
+ val addedDefs = addedParams(cls, isLocal = true , ParamAccessor )
135
147
val addedSyms = addedDefs.map(_.symbol.entered)
136
148
val addedForwarders = addedEnumForwarders(cls)
137
149
cpy.Template (templ)(
138
150
parents = addEnumConstrArgs(defn.JavaEnumClass , templ.parents, addedSyms.map(ref)),
139
151
body = params ++ addedDefs ++ addedForwarders ++ rest)
140
- }
141
- else if (cls.isAnonymousClass && ((cls.owner.name eq nme.DOLLAR_NEW ) || cls.owner.isAllOf(EnumCase )) &&
142
- cls.owner.owner.linkedClass.derivesFromJavaEnum) {
152
+ else if isJavaEnumValueImpl(cls) then
143
153
def rhsOf (name : TermName ) =
144
- templ.body.collect {
145
- case mdef : DefDef if mdef.name == name => mdef.rhs
146
- }.head
154
+ templ.body.collect({ case mdef : DefDef if mdef.name == name => mdef.rhs }).head
155
+ def removeDefs ( body : List [ Tree ], names : TermName * ) =
156
+ body.filterNot { case ndef : DefDef => names.contains(ndef.name); case _ => false }
147
157
val args = List (rhsOf(nme.toString_), rhsOf(nme.ordinalDollar))
148
158
cpy.Template (templ)(
149
- parents = addEnumConstrArgs(cls.owner.owner.linkedClass, templ.parents, args))
150
- }
159
+ parents = addEnumConstrArgs(cls.owner.owner.linkedClass, templ.parents, args),
160
+ body = removeDefs(templ.body, nme.toString_, nme.ordinalDollar)
161
+ )
151
162
else templ
152
163
}
153
164
}
0 commit comments