@@ -56,18 +56,21 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
56
56
private [this ] var myValueSymbols : List [Symbol ] = Nil
57
57
private [this ] var myCaseSymbols : List [Symbol ] = Nil
58
58
private [this ] var myCaseModuleSymbols : List [Symbol ] = Nil
59
+ private [this ] var myEnumCaseSymbols : List [Symbol ] = Nil
59
60
60
61
private def initSymbols (implicit ctx : Context ) =
61
62
if (myValueSymbols.isEmpty) {
62
63
myValueSymbols = List (defn.Any_hashCode , defn.Any_equals )
63
64
myCaseSymbols = myValueSymbols ++ List (defn.Any_toString , defn.Product_canEqual ,
64
65
defn.Product_productArity , defn.Product_productPrefix , defn.Product_productElement )
65
66
myCaseModuleSymbols = myCaseSymbols.filter(_ ne defn.Any_equals )
67
+ myEnumCaseSymbols = List (defn.Enum_ordinal )
66
68
}
67
69
68
70
def valueSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myValueSymbols }
69
71
def caseSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myCaseSymbols }
70
72
def caseModuleSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myCaseModuleSymbols }
73
+ def enumCaseSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myEnumCaseSymbols }
71
74
72
75
private def existingDef (sym : Symbol , clazz : ClassSymbol )(implicit ctx : Context ): Symbol = {
73
76
val existing = sym.matchingMember(clazz.thisType)
@@ -86,12 +89,15 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
86
89
lazy val accessors =
87
90
if (isDerivedValueClass(clazz)) clazz.paramAccessors.take(1 ) // Tail parameters can only be `erased`
88
91
else clazz.caseAccessors
92
+ val isEnumCase = clazz.derivesFrom(defn.EnumClass )
89
93
90
94
val symbolsToSynthesize : List [Symbol ] =
91
95
if (clazz.is(Case )) {
92
96
if (clazz.is(Module )) caseModuleSymbols
97
+ else if (isEnumCase) caseSymbols ++ enumCaseSymbols
93
98
else caseSymbols
94
99
}
100
+ else if (isEnumCase) enumCaseSymbols
95
101
else if (isDerivedValueClass(clazz)) valueSymbols
96
102
else Nil
97
103
@@ -120,6 +126,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
120
126
case nme.productArity => Literal (Constant (accessors.length))
121
127
case nme.productPrefix => ownName
122
128
case nme.productElement => productElementBody(accessors.length, vrefss.head.head)
129
+ case nme.ordinal => Select (This (clazz), nme.ordinalDollar)
123
130
}
124
131
ctx.log(s " adding $synthetic to $clazz at ${ctx.phase}" )
125
132
synthesizeDef(synthetic, syntheticRHS)
@@ -362,7 +369,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
362
369
363
370
/** For an enum T:
364
371
*
365
- * def ordinal(x: MirroredMonoType) = x.ordinal
372
+ * def ordinal(x: MirroredMonoType) = x.$ ordinal
366
373
*
367
374
* For sealed trait with children of normalized types C_1, ..., C_n:
368
375
*
@@ -377,7 +384,13 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
377
384
* O is O.type.
378
385
*/
379
386
def ordinalBody (cls : Symbol , param : Tree )(implicit ctx : Context ): Tree =
380
- if (cls.is(Enum )) Apply (param.select(nme.ordinal), Nil )
387
+ if (cls.is(Enum )) {
388
+ val ordinalMeth = param.select(nme.ordinal)
389
+ val derivesFromJEnum =
390
+ cls.is(Enum , butNot = Case ) &&
391
+ cls.info.parents.exists(p => p.typeSymbol == defn.JEnumClass )
392
+ if (derivesFromJEnum) Apply (ordinalMeth, Nil ) else ordinalMeth
393
+ }
381
394
else {
382
395
val cases =
383
396
for ((child, idx) <- cls.children.zipWithIndex) yield {
0 commit comments