@@ -40,6 +40,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
4040 sym == defn.JavaEnumClass .primaryConstructor ||
4141 sym.owner.derivesFromJavaEnum))
4242 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
4347 else tp
4448
4549 /** Add constructor parameters `$name: String` and `$ordinal: Int` to the end of
@@ -62,9 +66,10 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
6266 /** The list of parameter definitions `$name: String, $ordinal: Int`, in given `owner`
6367 * with given flags (either `Param` or `ParamAccessor`)
6468 */
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)
6873 List (ValDef (nameParam), ValDef (ordinalParam))
6974 }
7075
@@ -85,7 +90,7 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
8590 val sym = tree.symbol
8691 if (sym.isConstructor && sym.owner.derivesFromJavaEnum)
8792 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 )))
8994 sym.setParamssFromDefs(tree1.tparams, tree1.vparamss)
9095 tree1
9196 else tree
@@ -107,6 +112,11 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
107112 }
108113 }
109114
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+
110120 /** 1. If this is an enum class, add $name and $ordinal parameters to its
111121 * parameter accessors and pass them on to the java.lang.Enum constructor.
112122 *
@@ -116,38 +126,39 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
116126 *
117127 * class $anon extends E(...) {
118128 * ...
119- * def ordinal = N
120- * def toString = S
129+ * private def $ ordinal = N
130+ * override def toString = S
121131 * ...
122132 * }
123133 *
124134 * After the transform it is expanded to
125135 *
126136 * class $anon extends E(..., N, S) {
127- * "same as before"
137+ * ...
138+ * "removed $ordinal and toString"
139+ * ...
128140 * }
129141 */
130142 override def transformTemplate (templ : Template )(using Context ): Template = {
131143 val cls = templ.symbol.owner
132- if ( cls.derivesFromJavaEnum) {
144+ if cls.derivesFromJavaEnum then
133145 val (params, rest) = decomposeTemplateBody(templ.body)
134- val addedDefs = addedParams(cls, ParamAccessor )
146+ val addedDefs = addedParams(cls, isLocal = true , ParamAccessor )
135147 val addedSyms = addedDefs.map(_.symbol.entered)
136148 val addedForwarders = addedEnumForwarders(cls)
137149 cpy.Template (templ)(
138150 parents = addEnumConstrArgs(defn.JavaEnumClass , templ.parents, addedSyms.map(ref)),
139151 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
143153 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 }
147157 val args = List (rhsOf(nme.toString_), rhsOf(nme.ordinalDollar))
148158 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+ )
151162 else templ
152163 }
153164}
0 commit comments