@@ -16,7 +16,6 @@ import dotty.tools.dotc.ast.Trees._
16
16
import SymUtils ._
17
17
18
18
import annotation .threadUnsafe
19
- import collection .mutable
20
19
21
20
object CompleteJavaEnums {
22
21
val name : String = " completeJavaEnums"
@@ -116,13 +115,13 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
116
115
&& (((cls.owner.name eq nme.DOLLAR_NEW ) && cls.owner.isAllOf(Private | Synthetic )) || cls.owner.isAllOf(EnumCase ))
117
116
&& cls.owner.owner.linkedClass.derivesFromJavaEnum
118
117
119
- @ threadUnsafe
120
- private lazy val enumCaseOrdinals : mutable.Map [Symbol , Int ] = mutable.AnyRefMap .empty
118
+ private val enumCaseOrdinals : MutableSymbolMap [Int ] = newMutableSymbolMap
121
119
122
120
private def registerEnumClass (cls : Symbol )(using Context ): Unit =
123
121
cls.children.zipWithIndex.foreach(enumCaseOrdinals.put)
124
122
125
- private def ordinalFor (enumCase : Symbol ): Int = enumCaseOrdinals.remove(enumCase).get
123
+ private def ordinalFor (enumCase : Symbol ): Int =
124
+ enumCaseOrdinals.remove(enumCase).get
126
125
127
126
/** 1. If this is an enum class, add $name and $ordinal parameters to its
128
127
* parameter accessors and pass them on to the java.lang.Enum constructor.
@@ -145,17 +144,20 @@ class CompleteJavaEnums extends MiniPhase with InfoTransformer { thisPhase =>
145
144
* "same as before"
146
145
* }
147
146
*/
148
- override def transformTemplate (templ : Template )(using Context ): Template = {
147
+ override def transformTemplate (templ : Template )(using Context ): Tree = {
149
148
val cls = templ.symbol.owner
150
149
if cls.derivesFromJavaEnum then
151
- registerEnumClass(cls)
150
+ registerEnumClass(cls) // invariant: class is visited before cases: see tests/pos/enum-companion-first.scala
152
151
val (params, rest) = decomposeTemplateBody(templ.body)
153
152
val addedDefs = addedParams(cls, isLocal= true , ParamAccessor )
154
153
val addedSyms = addedDefs.map(_.symbol.entered)
155
154
val addedForwarders = addedEnumForwarders(cls)
156
155
cpy.Template (templ)(
157
156
parents = addEnumConstrArgs(defn.JavaEnumClass , templ.parents, addedSyms.map(ref)),
158
157
body = params ++ addedDefs ++ addedForwarders ++ rest)
158
+ else if cls.linkedClass.derivesFromJavaEnum then
159
+ enumCaseOrdinals.clear() // remove simple cases // invariant: companion is visited after cases
160
+ templ
159
161
else if isJavaEnumValueImpl(cls) then
160
162
def creatorParamRef (name : TermName ) =
161
163
ref(cls.owner.paramSymss.head.find(_.name == name).get)
0 commit comments