Skip to content

Commit 30d8d87

Browse files
committed
Emit enum utility methods only if enum class is not generic
1 parent 18d0ae5 commit 30d8d87

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ object DesugarEnums {
9191
else cdef
9292

9393
private def valuesDot(name: String) = Select(Ident(nme.DOLLAR_VALUES), name.toTermName)
94-
private def registerCall = Apply(valuesDot("register"), This(EmptyTypeIdent) :: Nil)
94+
private def registerCall(implicit ctx: Context): List[Tree] =
95+
if (enumClass.typeParams.nonEmpty) Nil
96+
else Apply(valuesDot("register"), This(EmptyTypeIdent) :: Nil) :: Nil
9597

9698
/** The following lists of definitions for an enum type E:
9799
*
@@ -101,12 +103,11 @@ object DesugarEnums {
101103
* def enumValues = $values.values
102104
*/
103105
private def enumScaffolding(implicit ctx: Context): List[Tree] = {
104-
val enumType = enumClass.typeRef.appliedTo(enumClass.typeParams.map(_ => TypeBounds.empty))
105106
def enumDefDef(name: String, select: String) =
106107
DefDef(name.toTermName, Nil, Nil, TypeTree(), valuesDot(select))
107108
val privateValuesDef =
108109
ValDef(nme.DOLLAR_VALUES, TypeTree(),
109-
New(TypeTree(defn.EnumValuesType.appliedTo(enumType :: Nil)), ListOfNil))
110+
New(TypeTree(defn.EnumValuesType.appliedTo(enumClass.typeRef :: Nil)), ListOfNil))
110111
.withFlags(Private)
111112
val valueOfDef = enumDefDef("enumValue", "fromInt")
112113
val withNameDef = enumDefDef("enumValueNamed", "fromName")
@@ -131,7 +132,7 @@ object DesugarEnums {
131132
DefDef(nme.toString_, Nil, Nil, TypeTree(), Ident(nme.name))
132133
.withFlags(Override)
133134
def creator = New(Template(emptyConstructor, enumClassRef :: Nil, EmptyValDef,
134-
List(enumTagDef, toStringDef, registerCall)))
135+
List(enumTagDef, toStringDef) ++ registerCall))
135136
DefDef(nme.DOLLAR_NEW, Nil,
136137
List(List(param(nme.tag, defn.IntType), param(nme.name, defn.StringType))),
137138
TypeTree(), creator)
@@ -147,7 +148,7 @@ object DesugarEnums {
147148
val minKind = if (kind < seenKind) kind else seenKind
148149
ctx.tree.pushAttachment(EnumCaseCount, (count + 1, minKind))
149150
val scaffolding =
150-
if (kind >= seenKind) Nil
151+
if (enumClass.typeParams.nonEmpty || kind >= seenKind) Nil
151152
else if (kind == CaseKind.Object) enumScaffolding
152153
else if (seenKind == CaseKind.Object) enumValueCreator :: Nil
153154
else enumScaffolding :+ enumValueCreator
@@ -177,7 +178,8 @@ object DesugarEnums {
177178
DefDef(nme.toString_, Nil, Nil, TypeTree(defn.StringType), Literal(Constant(name.toString)))
178179
.withFlags(Override)
179180
val (tagMeth, scaffolding) = enumTagMeth(CaseKind.Object)
180-
val impl1 = cpy.Template(impl)(body = impl.body ++ List(tagMeth, toStringMeth, registerCall))
181+
val impl1 = cpy.Template(impl)(body =
182+
impl.body ++ List(tagMeth, toStringMeth) ++ registerCall)
181183
val vdef = ValDef(name, TypeTree(), New(impl1)).withMods(mods | Final).withPos(pos)
182184
flatTree(scaffolding ::: vdef :: Nil).withPos(pos.startPos)
183185
}

0 commit comments

Comments
 (0)