Skip to content

Commit c11c43e

Browse files
committed
use enumLabel as the canonical name
1 parent 25fd2e3 commit c11c43e

File tree

10 files changed

+118
-61
lines changed

10 files changed

+118
-61
lines changed

compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +134,18 @@ object DesugarEnums {
134134
private def enumValueCreator(using Context) = {
135135
val fieldMethods =
136136
if isJavaEnum then
137-
val productPrefixDef = productPrefixMeth(Select(This(Ident(tpnme.EMPTY)), nme.name))
138-
productPrefixDef :: Nil
137+
val enumLabelDef = enumLabelMeth(Select(This(Ident(tpnme.EMPTY)), nme.name))
138+
enumLabelDef :: Nil
139139
else
140-
val ordinalDef = ordinalMeth(Ident(nme.ordinalDollar_))
141-
val productPrefixDef = productPrefixMeth(Ident(nme.nameDollar))
142-
ordinalDef :: productPrefixDef :: Nil
140+
val ordinalDef = ordinalMeth(Ident(nme.ordinalDollar_))
141+
val enumLabelDef = enumLabelMeth(Ident(nme.nameDollar))
142+
ordinalDef :: enumLabelDef :: Nil
143143
val creator = New(Template(
144144
constr = emptyConstructor,
145145
parents = enumClassRef :: scalaRuntimeDot(tpnme.EnumValue) :: Nil,
146146
derived = Nil,
147147
self = EmptyValDef,
148-
body = fieldMethods ::: registerCall :: Nil
148+
body = fieldMethods ::: productPrefixMeth :: registerCall :: Nil
149149
).withAttachment(ExtendsSingletonMirror, ()))
150150
DefDef(nme.DOLLAR_NEW, Nil,
151151
List(List(param(nme.ordinalDollar_, defn.IntType), param(nme.nameDollar, defn.StringType))),
@@ -276,14 +276,19 @@ object DesugarEnums {
276276
def ordinalMeth(body: Tree)(using Context): DefDef =
277277
DefDef(nme.ordinal, Nil, Nil, TypeTree(defn.IntType), body)
278278

279-
def productPrefixMeth(body: Tree)(using Context): DefDef =
280-
DefDef(nme.productPrefix, Nil, Nil, TypeTree(defn.StringType), body).withFlags(Override)
279+
def enumLabelMeth(body: Tree)(using Context): DefDef =
280+
DefDef(nme.enumLabel, Nil, Nil, TypeTree(defn.StringType), body).withFlags(Override)
281+
282+
def productPrefixMeth(using Context): DefDef =
283+
// TODO: once `scala.Enum` is rebootstrapped and `.valueOf` is implemented in terms of `enumLabel` we can make
284+
// `productPrefix` overrideable in SyntheticMembers
285+
DefDef(nme.productPrefix, Nil, Nil, TypeTree(defn.StringType), Select(This(EmptyTypeIdent), nme.enumLabel)).withFlags(Override)
281286

282287
def ordinalMethLit(ord: Int)(using Context): DefDef =
283288
ordinalMeth(Literal(Constant(ord)))
284289

285-
def productPrefixLit(name: String)(using Context): DefDef =
286-
productPrefixMeth(Literal(Constant(name)))
290+
def enumLabelLit(name: String)(using Context): DefDef =
291+
enumLabelMeth(Literal(Constant(name)))
287292

288293
/** Expand a module definition representing a parameterless enum case */
289294
def expandEnumModule(name: TermName, impl: Template, mods: Modifiers, span: Span)(using Context): Tree = {
@@ -293,12 +298,12 @@ object DesugarEnums {
293298
expandSimpleEnumCase(name, mods, span)
294299
else {
295300
val (tag, scaffolding) = nextOrdinal(CaseKind.Object)
296-
val productPrefixDef = productPrefixLit(name.toString)
297-
val ordinalDef = if isJavaEnum then Nil else ordinalMethLit(tag) :: Nil
301+
val ordinalDef = if isJavaEnum then Nil else ordinalMethLit(tag) :: Nil
302+
val enumLabelDef = enumLabelLit(name.toString)
298303
val impl1 = cpy.Template(impl)(
299304
parents = impl.parents :+ scalaRuntimeDot(tpnme.EnumValue),
300-
body = ordinalDef ::: productPrefixDef :: registerCall :: Nil)
301-
.withAttachment(ExtendsSingletonMirror, ())
305+
body = ordinalDef ::: enumLabelDef :: productPrefixMeth :: registerCall :: Nil
306+
).withAttachment(ExtendsSingletonMirror, ())
302307
val vdef = ValDef(name, TypeTree(), New(impl1)).withMods(mods.withAddedFlags(EnumValue, span))
303308
flatTree(scaffolding ::: vdef :: Nil).withSpan(span)
304309
}

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,7 @@ class Definitions {
649649

650650
@tu lazy val EnumClass: ClassSymbol = requiredClass("scala.Enum")
651651
@tu lazy val Enum_ordinal: Symbol = EnumClass.requiredMethod(nme.ordinal)
652+
@tu lazy val Enum_enumLabel: Symbol = EnumClass.requiredMethod(nme.enumLabel)
652653

653654
@tu lazy val EnumValuesClass: ClassSymbol = requiredClass("scala.runtime.EnumValues")
654655

compiler/src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ object StdNames {
453453
val emptyValDef: N = "emptyValDef"
454454
val end: N = "end"
455455
val ensureAccessible : N = "ensureAccessible"
456+
val enumLabel: N = "enumLabel"
456457
val eq: N = "eq"
457458
val eqInstance: N = "eqInstance"
458459
val equalsNumChar : N = "equalsNumChar"

compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
5757
private var myValueSymbols: List[Symbol] = Nil
5858
private var myCaseSymbols: List[Symbol] = Nil
5959
private var myCaseModuleSymbols: List[Symbol] = Nil
60-
private var myEnumValueSymbols: List[Symbol] = Nil
60+
private var myEnumCaseClassSymbols: List[Symbol] = Nil
61+
private var myNonJavaEnumValueSymbols: List[Symbol] = Nil
6162

6263
private def initSymbols(using Context) =
6364
if (myValueSymbols.isEmpty) {
@@ -66,13 +67,15 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
6667
defn.Product_productArity, defn.Product_productPrefix, defn.Product_productElement,
6768
defn.Product_productElementName)
6869
myCaseModuleSymbols = myCaseSymbols.filter(_ ne defn.Any_equals)
69-
myEnumValueSymbols = List(defn.Any_toString)
70+
myEnumCaseClassSymbols = List(defn.Enum_enumLabel)
71+
myNonJavaEnumValueSymbols = List(defn.Any_toString)
7072
}
7173

7274
def valueSymbols(using Context): List[Symbol] = { initSymbols; myValueSymbols }
7375
def caseSymbols(using Context): List[Symbol] = { initSymbols; myCaseSymbols }
7476
def caseModuleSymbols(using Context): List[Symbol] = { initSymbols; myCaseModuleSymbols }
75-
def enumValueSymbols(using Context): List[Symbol] = { initSymbols; myEnumValueSymbols }
77+
def enumCaseClassSymbols(using Context): List[Symbol] = { initSymbols; myEnumCaseClassSymbols }
78+
def nonJavaEnumValueSymbols(using Context): List[Symbol] = { initSymbols; myNonJavaEnumValueSymbols }
7679

7780
private def existingDef(sym: Symbol, clazz: ClassSymbol)(using Context): Symbol = {
7881
val existing = sym.matchingMember(clazz.thisType)
@@ -92,17 +95,15 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
9295
if (isDerivedValueClass(clazz)) clazz.paramAccessors.take(1) // Tail parameters can only be `erased`
9396
else clazz.caseAccessors
9497
val isEnumCase = clazz.derivesFrom(defn.EnumClass) && clazz != defn.EnumClass
95-
val isNonJavaEnumValue =
96-
isEnumCase
97-
&& clazz.isAnonymousClass
98-
&& clazz.classParents.head.classSymbol.is(Enum)
99-
&& !clazz.derivesFrom(defn.JavaEnumClass)
98+
val isEnumValue = isEnumCase && clazz.isAnonymousClass && clazz.classParents.head.classSymbol.is(Enum)
99+
val isNonJavaEnumValue = isEnumValue && !clazz.derivesFrom(defn.JavaEnumClass)
100100

101101
val symbolsToSynthesize: List[Symbol] =
102102
if (clazz.is(Case))
103103
if (clazz.is(Module)) caseModuleSymbols
104+
else if (isEnumCase) caseSymbols ++ enumCaseClassSymbols
104105
else caseSymbols
105-
else if (isNonJavaEnumValue) enumValueSymbols
106+
else if (isNonJavaEnumValue) nonJavaEnumValueSymbols
106107
else if (isDerivedValueClass(clazz)) valueSymbols
107108
else Nil
108109

@@ -122,12 +123,12 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
122123
def ownName: Tree =
123124
Literal(Constant(clazz.name.stripModuleClassSuffix.toString))
124125

125-
def callProductPrefix: Tree =
126-
Select(This(clazz), nme.productPrefix).ensureApplied
126+
def callEnumLabel: Tree =
127+
Select(This(clazz), nme.enumLabel).ensureApplied
127128

128129
def toStringBody(vrefss: List[List[Tree]]): Tree =
129130
if (clazz.is(ModuleClass)) ownName
130-
else if (isNonJavaEnumValue) callProductPrefix
131+
else if (isNonJavaEnumValue) callEnumLabel
131132
else forwardToRuntime(vrefss.head)
132133

133134
def syntheticRHS(vrefss: List[List[Tree]])(using Context): Tree = synthetic.name match {
@@ -137,7 +138,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
137138
case nme.equals_ => equalsBody(vrefss.head.head)
138139
case nme.canEqual_ => canEqualBody(vrefss.head.head)
139140
case nme.productArity => Literal(Constant(accessors.length))
140-
case nme.productPrefix => ownName
141+
case nme.productPrefix | nme.enumLabel => ownName
141142
case nme.productElement => productElementBody(accessors.length, vrefss.head.head)
142143
case nme.productElementName => productElementNameBody(accessors.length, vrefss.head.head)
143144
}

docs/docs/reference/enums/desugarEnums.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,15 +175,18 @@ If `E` contains at least one simple case, its companion object will define in ad
175175
```scala
176176
private def $new(_$ordinal: Int, $name: String) = new E with runtime.EnumValue {
177177
def ordinal = _$ordinal
178-
override def productPrefix = $name
179-
override def toString = productPrefix
178+
def enumLabel = $name
179+
override def productPrefix = enumLabel // if not overridden in `E`
180+
override def toString = enumLabel // if not overridden in `E`
180181
$values.register(this) // register enum value so that `valueOf` and `values` can return it.
181182
}
182183
```
183184

184185
The anonymous class also implements the abstract `Product` methods that it inherits from `Enum`.
185-
The `ordinal` method is only generated if the enum does not extend from `java.lang.Enum` (as Scala enums do not extend `java.lang.Enum`s unless explicitly specified). In case it does, there is no need to generate `ordinal` as `java.lang.Enum` defines it. Similarly there is no need to override `toString` as that is defined in terms of `name` in
186-
`java.lang.Enum`.
186+
The `ordinal` method is only generated if the enum does not extend from `java.lang.Enum` (as Scala enums do not extend
187+
`java.lang.Enum`s unless explicitly specified). In case it does, there is no need to generate `ordinal` as
188+
`java.lang.Enum` defines it. Similarly there is no need to override `toString` as that is defined in terms of `name` in
189+
`java.lang.Enum`. Finally, `enumLabel` will call `this.name` when `E` extends `java.lang.Enum`.
187190

188191
### Scopes for Enum Cases
189192

docs/docs/reference/enums/enums.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ package scala
119119
trait Enum extends Product with Serializable {
120120

121121
/** A string uniquely identifying a case of an enum */
122-
final def enumLabel: String = productPrefix
122+
def enumLabel: String
123123

124124
/** A number uniquely identifying a case of an enum */
125125
def ordinal: Int
@@ -133,8 +133,9 @@ For instance, the `Venus` value above would be defined like this:
133133
val Venus: Planet =
134134
new Planet(4.869E24, 6051800.0) {
135135
def ordinal: Int = 1
136-
override def productPrefix: String = "Venus"
137-
override def toString: String = productPrefix
136+
def enumLabel: String = "Venus"
137+
override def productPrefix: String = enumLabel
138+
override def toString: String = enumLabel
138139
// internal code to register value
139140
}
140141
```

library/src-bootstrapped/scala/Enum.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package scala
44
trait Enum extends Product, Serializable:
55

66
/** A string uniquely identifying a case of an enum */
7-
final def enumLabel: String = productPrefix
7+
def enumLabel: String
88

99
/** A number uniquely identifying a case of an enum */
1010
def ordinal: Int

tests/neg/enumsLabelDef.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
enum Labelled {
2+
case A // error: cannot override final member method enumLabel in class Labelled
3+
case B(arg: Int) // ok: enumLabel has same behaviour here as productPrefix
4+
5+
override final def enumLabel: String = "nolabel"
6+
}

tests/pos/enum-List-control.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ abstract sealed class List[T] extends Enum
22
object List {
33
final class Cons[T](x: T, xs: List[T]) extends List[T] {
44
def ordinal = 0
5+
def enumLabel = "Cons"
56
def canEqual(that: Any): Boolean = that.isInstanceOf[Cons[_]]
67
def productArity: Int = 2
78
def productElement(n: Int): Any = n match
@@ -13,6 +14,7 @@ object List {
1314
}
1415
final class Nil[T]() extends List[T], runtime.EnumValue {
1516
def ordinal = 1
17+
def enumLabel = "Nil"
1618
}
1719
object Nil {
1820
def apply[T](): List[T] = new Nil()

tests/run/enum-custom-toString.scala

Lines changed: 63 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,43 +24,80 @@ enum EC: // control case
2424
case F
2525
case G(arg: Int)
2626

27+
enum EO:
28+
case H
29+
case I(arg: Int)
30+
// TODO: allow `productPrefix` to be overridden in singleton enum values - until `scala.Enum` is bootstrapped with
31+
// `enumLabel`, `runtime.EnumValues` uses `productPrefix` for by-name lookup.
32+
override def productPrefix: String = "noprefix"
33+
end EO
34+
35+
enum EL {
36+
case J
37+
case K(arg: Int)
38+
override def enumLabel: String = "nolabel" // will always be overridden by simple cases
39+
}
40+
41+
enum EQ[T] {
42+
case L extends EQ[Int]
43+
override def enumLabel: String = "nolabel" // will always be overridden by value cases
44+
}
45+
2746
abstract class Tag[T] extends Enum
2847
object Tag:
2948
private final class IntTagImpl extends Tag[Int] with runtime.EnumValue:
3049
def ordinal = 0
50+
def enumLabel = "IntTag"
3151
override def hashCode = 123
3252
final val IntTag: Tag[Int] = IntTagImpl()
3353

3454
@main def Test =
35-
assert(ES.A.toString == "overridden", s"ES.A.toString = ${ES.A.toString}")
36-
assert(ES.A.productPrefix == "A", s"ES.A.productPrefix = ${ES.A.productPrefix}")
37-
assert(ES.A.enumLabel == "A", s"ES.A.enumLabel = ${ES.A.enumLabel}")
38-
assert(ES.valueOf("A") == ES.A, s"ES.valueOf(A) = ${ES.valueOf("A")}")
39-
assert(EJ.B.toString == "overridden", s"EJ.B.toString = ${EJ.B.toString}")
40-
assert(EJ.B.productPrefix == "B", s"EJ.B.productPrefix = ${EJ.B.productPrefix}")
41-
assert(EJ.B.enumLabel == "B", s"EJ.B.enumLabel = ${EJ.B.enumLabel}")
42-
assert(EJ.valueOf("B") == EJ.B, s"EJ.valueOf(B) = ${EJ.valueOf("B")}")
43-
assert(EM.C.toString == "overridden", s"EM.C.toString = ${EM.C.toString}")
44-
assert(EM.C.productPrefix == "C", s"EM.C.productPrefix = ${EM.C.productPrefix}")
45-
assert(EM.C.enumLabel == "C", s"EM.C.enumLabel = ${EM.C.enumLabel}")
46-
assert(EM.valueOf("C") == EM.C, s"EM.valueOf(C) = ${EM.valueOf("C")}")
47-
assert(ET.D.toString == "overridden", s"ET.D.toString = ${ET.D.toString}")
48-
assert(ET.D.productPrefix == "D", s"ET.D.productPrefix = ${ET.D.productPrefix}")
49-
assert(ET.D.enumLabel == "D", s"ET.D.enumLabel = ${ET.D.enumLabel}")
50-
assert(EZ.E(0).toString == "overridden", s"EZ.E(0).toString = ${EZ.E(0).toString}")
51-
assert(EZ.E(0).productPrefix == "E", s"EZ.E(0).productPrefix = ${EZ.E(0).productPrefix}")
52-
assert(EZ.E(0).enumLabel == "E", s"EZ.E(0).enumLabel = ${EZ.E(0).enumLabel}")
53-
assert(EC.F.toString == "F", s"EC.F.toString = ${EC.F.toString}")
54-
assert(EC.F.productPrefix == "F", s"EC.F.productPrefix = ${EC.F.productPrefix}")
55-
assert(EC.F.enumLabel == "F", s"EC.F.enumLabel = ${EC.F.enumLabel}")
56-
assert(EC.valueOf("F") == EC.F, s"EC.valueOf(F) = ${EC.valueOf("F")}")
57-
assert(EC.G(0).toString == "G(0)", s"EC.G(0).toString = ${EC.G(0).toString}")
58-
assert(EC.G(0).productPrefix == "G", s"EC.G(0).productPrefix = ${EC.G(0).productPrefix}")
59-
assert(EC.G(0).enumLabel == "G", s"EC.G(0).enumLabel = ${EC.G(0).enumLabel}")
55+
assert(ES.A.toString == "overridden", s"ES.A.toString = ${ES.A.toString}")
56+
assert(ES.A.productPrefix == "A", s"ES.A.productPrefix = ${ES.A.productPrefix}")
57+
assert(ES.A.enumLabel == "A", s"ES.A.enumLabel = ${ES.A.enumLabel}")
58+
assert(ES.valueOf("A") == ES.A, s"ES.valueOf(A) = ${ES.valueOf("A")}")
59+
assert(EJ.B.toString == "overridden", s"EJ.B.toString = ${EJ.B.toString}")
60+
assert(EJ.B.productPrefix == "B", s"EJ.B.productPrefix = ${EJ.B.productPrefix}")
61+
assert(EJ.B.enumLabel == "B", s"EJ.B.enumLabel = ${EJ.B.enumLabel}")
62+
assert(EJ.valueOf("B") == EJ.B, s"EJ.valueOf(B) = ${EJ.valueOf("B")}")
63+
assert(EM.C.toString == "overridden", s"EM.C.toString = ${EM.C.toString}")
64+
assert(EM.C.productPrefix == "C", s"EM.C.productPrefix = ${EM.C.productPrefix}")
65+
assert(EM.C.enumLabel == "C", s"EM.C.enumLabel = ${EM.C.enumLabel}")
66+
assert(EM.valueOf("C") == EM.C, s"EM.valueOf(C) = ${EM.valueOf("C")}")
67+
assert(ET.D.toString == "overridden", s"ET.D.toString = ${ET.D.toString}")
68+
assert(ET.D.productPrefix == "D", s"ET.D.productPrefix = ${ET.D.productPrefix}")
69+
assert(ET.D.enumLabel == "D", s"ET.D.enumLabel = ${ET.D.enumLabel}")
70+
assert(EZ.E(0).toString == "overridden", s"EZ.E(0).toString = ${EZ.E(0).toString}")
71+
assert(EZ.E(0).productPrefix == "E", s"EZ.E(0).productPrefix = ${EZ.E(0).productPrefix}")
72+
assert(EZ.E(0).enumLabel == "E", s"EZ.E(0).enumLabel = ${EZ.E(0).enumLabel}")
73+
assert(EC.F.toString == "F", s"EC.F.toString = ${EC.F.toString}")
74+
assert(EC.F.productPrefix == "F", s"EC.F.productPrefix = ${EC.F.productPrefix}")
75+
assert(EC.F.enumLabel == "F", s"EC.F.enumLabel = ${EC.F.enumLabel}")
76+
assert(EC.valueOf("F") == EC.F, s"EC.valueOf(F) = ${EC.valueOf("F")}")
77+
assert(EC.G(0).toString == "G(0)", s"EC.G(0).toString = ${EC.G(0).toString}")
78+
assert(EC.G(0).productPrefix == "G", s"EC.G(0).productPrefix = ${EC.G(0).productPrefix}")
79+
assert(EC.G(0).enumLabel == "G", s"EC.G(0).enumLabel = ${EC.G(0).enumLabel}")
80+
assert(EO.H.toString == "H", s"EO.H.toString = ${EO.H.toString}")
81+
assert(EO.H.productPrefix == "H", s"EO.H.productPrefix = ${EO.H.productPrefix}") // TODO: enable override
82+
assert(EO.H.enumLabel == "H", s"EO.H.enumLabel = ${EO.H.enumLabel}")
83+
assert(EO.valueOf("H") == EO.H, s"EO.valueOf(H) = ${EO.valueOf("H")}")
84+
assert(EO.I(0).toString == "noprefix(0)", s"EO.I(0).toString = ${EO.I(0).toString}")
85+
assert(EO.I(0).productPrefix == "noprefix", s"EO.I(0).productPrefix = ${EO.I(0).productPrefix}")
86+
assert(EO.I(0).enumLabel == "I", s"EO.I(0).enumLabel = ${EO.I(0).enumLabel}")
87+
assert(EL.J.toString == "J", s"EL.J.toString = ${EL.J.toString}")
88+
assert(EL.J.productPrefix == "J", s"EL.J.productPrefix = ${EL.J.productPrefix}")
89+
assert(EL.J.enumLabel == "J", s"EL.J.enumLabel = ${EL.J.enumLabel}") // can't override label in simple case
90+
assert(EL.valueOf("J") == EL.J, s"EL.valueOf(J) = ${EL.valueOf("J")}")
91+
assert(EL.K(0).toString == "K(0)", s"EL.K(0).toString = ${EL.K(0).toString}")
92+
assert(EL.K(0).productPrefix == "K", s"EL.K(0).productPrefix = ${EL.K(0).productPrefix}")
93+
assert(EL.K(0).enumLabel == "nolabel", s"EL.K(0).enumLabel = ${EL.K(0).enumLabel}") // enum label overridden in class case
94+
assert(EQ.L.toString == "L", s"EQ.L.toString = ${EQ.L.toString}")
95+
assert(EQ.L.productPrefix == "L", s"EQ.L.productPrefix = ${EQ.L.productPrefix}")
96+
assert(EQ.L.enumLabel == "L", s"EQ.L.enumLabel = ${EQ.L.enumLabel}") // can't override label in value case
6097

6198
assert(
6299
assertion = Tag.IntTag.toString == s"${Tag.IntTag.getClass.getName}@${Integer.toHexString(123)}",
63100
message = s"Tag.IntTag.toString = ${Tag.IntTag.toString}"
64101
)
65102
assert(Tag.IntTag.productPrefix == Tag.IntTag.toString, s"Tag.IntTag.productPrefix = ${Tag.IntTag.productPrefix}")
66-
assert(Tag.IntTag.enumLabel == Tag.IntTag.toString, s"Tag.IntTag.enumLabel = ${Tag.IntTag.enumLabel}")
103+
assert(Tag.IntTag.enumLabel == "IntTag", s"Tag.IntTag.enumLabel = ${Tag.IntTag.enumLabel}")

0 commit comments

Comments
 (0)