@@ -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