@@ -91,7 +91,9 @@ object DesugarEnums {
91
91
else cdef
92
92
93
93
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
95
97
96
98
/** The following lists of definitions for an enum type E:
97
99
*
@@ -101,12 +103,11 @@ object DesugarEnums {
101
103
* def enumValues = $values.values
102
104
*/
103
105
private def enumScaffolding (implicit ctx : Context ): List [Tree ] = {
104
- val enumType = enumClass.typeRef.appliedTo(enumClass.typeParams.map(_ => TypeBounds .empty))
105
106
def enumDefDef (name : String , select : String ) =
106
107
DefDef (name.toTermName, Nil , Nil , TypeTree (), valuesDot(select))
107
108
val privateValuesDef =
108
109
ValDef (nme.DOLLAR_VALUES , TypeTree (),
109
- New (TypeTree (defn.EnumValuesType .appliedTo(enumType :: Nil )), ListOfNil ))
110
+ New (TypeTree (defn.EnumValuesType .appliedTo(enumClass.typeRef :: Nil )), ListOfNil ))
110
111
.withFlags(Private )
111
112
val valueOfDef = enumDefDef(" enumValue" , " fromInt" )
112
113
val withNameDef = enumDefDef(" enumValueNamed" , " fromName" )
@@ -131,7 +132,7 @@ object DesugarEnums {
131
132
DefDef (nme.toString_, Nil , Nil , TypeTree (), Ident (nme.name))
132
133
.withFlags(Override )
133
134
def creator = New (Template (emptyConstructor, enumClassRef :: Nil , EmptyValDef ,
134
- List (enumTagDef, toStringDef, registerCall) ))
135
+ List (enumTagDef, toStringDef) ++ registerCall))
135
136
DefDef (nme.DOLLAR_NEW , Nil ,
136
137
List (List (param(nme.tag, defn.IntType ), param(nme.name, defn.StringType ))),
137
138
TypeTree (), creator)
@@ -147,7 +148,7 @@ object DesugarEnums {
147
148
val minKind = if (kind < seenKind) kind else seenKind
148
149
ctx.tree.pushAttachment(EnumCaseCount , (count + 1 , minKind))
149
150
val scaffolding =
150
- if (kind >= seenKind) Nil
151
+ if (enumClass.typeParams.nonEmpty || kind >= seenKind) Nil
151
152
else if (kind == CaseKind .Object ) enumScaffolding
152
153
else if (seenKind == CaseKind .Object ) enumValueCreator :: Nil
153
154
else enumScaffolding :+ enumValueCreator
@@ -177,7 +178,8 @@ object DesugarEnums {
177
178
DefDef (nme.toString_, Nil , Nil , TypeTree (defn.StringType ), Literal (Constant (name.toString)))
178
179
.withFlags(Override )
179
180
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)
181
183
val vdef = ValDef (name, TypeTree (), New (impl1)).withMods(mods | Final ).withPos(pos)
182
184
flatTree(scaffolding ::: vdef :: Nil ).withPos(pos.startPos)
183
185
}
0 commit comments