@@ -68,7 +68,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
68
68
myCaseSymbols = defn.caseClassSynthesized
69
69
myCaseModuleSymbols = myCaseSymbols.filter(_ ne defn.Any_equals )
70
70
myEnumValueSymbols = List (defn.Product_productPrefix )
71
- myNonJavaEnumValueSymbols = myEnumValueSymbols :+ defn.Any_toString :+ defn.Enum_ordinal
71
+ myNonJavaEnumValueSymbols = myEnumValueSymbols :+ defn.Any_toString :+ defn.Enum_ordinal :+ defn. Any_hashCode
72
72
}
73
73
74
74
def valueSymbols (using Context ): List [Symbol ] = { initSymbols; myValueSymbols }
@@ -110,6 +110,12 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
110
110
def syntheticDefIfMissing (sym : Symbol ): List [Tree ] =
111
111
if (existingDef(sym, clazz).exists) Nil else syntheticDef(sym) :: Nil
112
112
113
+ def identifierRef : Tree =
114
+ if isSimpleEnumValue then // owner is `def $new(_$ordinal: Int, $name: String) = new MyEnum { ... }`
115
+ ref(clazz.owner.paramSymss.head.find(_.name == nme.nameDollar).get)
116
+ else // assume owner is `val Foo = new MyEnum { def ordinal = 0 }`
117
+ Literal (Constant (clazz.owner.name.toString))
118
+
113
119
def syntheticDef (sym : Symbol ): Tree = {
114
120
val synthetic = sym.copy(
115
121
owner = clazz,
@@ -129,12 +135,6 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
129
135
else
130
136
identifierRef
131
137
132
- def identifierRef : Tree =
133
- if isSimpleEnumValue then // owner is `def $new(_$ordinal: Int, $name: String) = new MyEnum { ... }`
134
- ref(clazz.owner.paramSymss.head.find(_.name == nme.nameDollar).get)
135
- else // assume owner is `val Foo = new MyEnum { def ordinal = 0 }`
136
- Literal (Constant (clazz.owner.name.toString))
137
-
138
138
def ordinalRef : Tree =
139
139
if isSimpleEnumValue then // owner is `def $new(_$ordinal: Int, $name: String) = new MyEnum { ... }`
140
140
ref(clazz.owner.paramSymss.head.find(_.name == nme.ordinalDollar_).get)
@@ -322,7 +322,8 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
322
322
* For case classes with primitive paramters, see [[caseHashCodeBody ]].
323
323
*/
324
324
def chooseHashcode (using Context ) =
325
- if (accessors.isEmpty) Literal (Constant (ownName.hashCode))
325
+ if (isNonJavaEnumValue) identifierRef.select(nme.hashCode_).appliedToTermArgs(Nil )
326
+ else if (accessors.isEmpty) Literal (Constant (ownName.hashCode))
326
327
else if (accessors.exists(_.info.finalResultType.classSymbol.isPrimitiveValueClass))
327
328
caseHashCodeBody
328
329
else
0 commit comments