@@ -56,18 +56,21 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
5656 private [this ] var myValueSymbols : List [Symbol ] = Nil
5757 private [this ] var myCaseSymbols : List [Symbol ] = Nil
5858 private [this ] var myCaseModuleSymbols : List [Symbol ] = Nil
59+ private [this ] var myEnumCaseSymbols : List [Symbol ] = Nil
5960
6061 private def initSymbols (implicit ctx : Context ) =
6162 if (myValueSymbols.isEmpty) {
6263 myValueSymbols = List (defn.Any_hashCode , defn.Any_equals )
6364 myCaseSymbols = myValueSymbols ++ List (defn.Any_toString , defn.Product_canEqual ,
6465 defn.Product_productArity , defn.Product_productPrefix , defn.Product_productElement )
6566 myCaseModuleSymbols = myCaseSymbols.filter(_ ne defn.Any_equals )
67+ myEnumCaseSymbols = List (defn.Enum_ordinal )
6668 }
6769
6870 def valueSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myValueSymbols }
6971 def caseSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myCaseSymbols }
7072 def caseModuleSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myCaseModuleSymbols }
73+ def enumCaseSymbols (implicit ctx : Context ): List [Symbol ] = { initSymbols; myEnumCaseSymbols }
7174
7275 private def existingDef (sym : Symbol , clazz : ClassSymbol )(implicit ctx : Context ): Symbol = {
7376 val existing = sym.matchingMember(clazz.thisType)
@@ -86,12 +89,15 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
8689 lazy val accessors =
8790 if (isDerivedValueClass(clazz)) clazz.paramAccessors.take(1 ) // Tail parameters can only be `erased`
8891 else clazz.caseAccessors
92+ val isEnumCase = clazz.derivesFrom(defn.EnumClass )
8993
9094 val symbolsToSynthesize : List [Symbol ] =
9195 if (clazz.is(Case )) {
9296 if (clazz.is(Module )) caseModuleSymbols
97+ else if (isEnumCase) caseSymbols ++ enumCaseSymbols
9398 else caseSymbols
9499 }
100+ else if (isEnumCase) enumCaseSymbols
95101 else if (isDerivedValueClass(clazz)) valueSymbols
96102 else Nil
97103
@@ -120,6 +126,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
120126 case nme.productArity => Literal (Constant (accessors.length))
121127 case nme.productPrefix => ownName
122128 case nme.productElement => productElementBody(accessors.length, vrefss.head.head)
129+ case nme.ordinal => Select (This (clazz), nme.ordinalDollar)
123130 }
124131 ctx.log(s " adding $synthetic to $clazz at ${ctx.phase}" )
125132 synthesizeDef(synthetic, syntheticRHS)
@@ -362,7 +369,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
362369
363370 /** For an enum T:
364371 *
365- * def ordinal(x: MirroredMonoType) = x.ordinal
372+ * def ordinal(x: MirroredMonoType) = x.$ ordinal
366373 *
367374 * For sealed trait with children of normalized types C_1, ..., C_n:
368375 *
@@ -377,7 +384,13 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
377384 * O is O.type.
378385 */
379386 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+ }
381394 else {
382395 val cases =
383396 for ((child, idx) <- cls.children.zipWithIndex) yield {
0 commit comments