@@ -77,9 +77,9 @@ object DesugarEnums {
7777 private def valuesDot (name : PreName )(implicit src : SourceFile ) =
7878 Select (Ident (nme.DOLLAR_VALUES ), name.toTermName)
7979
80- private def registerCall (using Context ): List [ Tree ] =
81- if ( enumClass.typeParams.nonEmpty) Nil
82- else Apply (valuesDot(" register" ), This ( EmptyTypeIdent ) :: Nil ) :: Nil
80+ private def registerCall (using Context ): Tree =
81+ val asRaw = TypeApply ( Select ( This ( EmptyTypeIdent ), nme.asInstanceOf_), rawRef( enumClass.typeRef) :: Nil ) // safe to cast due to refchecks
82+ Apply (valuesDot(" register" ), asRaw :: Nil )
8383
8484 /** The following lists of definitions for an enum type E:
8585 *
@@ -93,12 +93,14 @@ object DesugarEnums {
9393 * }
9494 */
9595 private def enumScaffolding (using Context ): List [Tree ] = {
96+ import dotty .tools .dotc .transform .SymUtils ._
97+ val rawEnumClassRef = rawRef(enumClass.typeRef)
98+ extension (tpe : NamedType ) def ofRawEnum = AppliedTypeTree (ref(tpe), rawEnumClassRef)
9699 val valuesDef =
97- DefDef (nme.values, Nil , Nil , TypeTree ( defn.ArrayOf (enumClass.typeRef)) , Select (valuesDot(nme.values), nme.toArray))
100+ DefDef (nme.values, Nil , Nil , defn.ArrayType .ofRawEnum , Select (valuesDot(nme.values), nme.toArray))
98101 .withFlags(Synthetic )
99102 val privateValuesDef =
100- ValDef (nme.DOLLAR_VALUES , TypeTree (),
101- New (TypeTree (defn.EnumValuesClass .typeRef.appliedTo(enumClass.typeRef :: Nil )), ListOfNil ))
103+ ValDef (nme.DOLLAR_VALUES , TypeTree (), New (defn.EnumValuesClass .typeRef.ofRawEnum, ListOfNil ))
102104 .withFlags(Private | Synthetic )
103105
104106 val valuesOfExnMessage = Apply (
@@ -138,7 +140,7 @@ object DesugarEnums {
138140 parents = enumClassRef :: scalaRuntimeDot(tpnme.EnumValue ) :: Nil ,
139141 derived = Nil ,
140142 self = EmptyValDef ,
141- body = List ( ordinalDef, toStringDef) ++ registerCall
143+ body = ordinalDef :: toStringDef :: registerCall :: Nil
142144 ).withAttachment(ExtendsSingletonMirror , ()))
143145 DefDef (nme.DOLLAR_NEW , Nil ,
144146 List (List (param(nme.ordinalDollar_, defn.IntType ), param(nme.nameDollar, defn.StringType ))),
@@ -254,7 +256,7 @@ object DesugarEnums {
254256 val minKind = if (kind < seenKind) kind else seenKind
255257 ctx.tree.pushAttachment(EnumCaseCount , (count + 1 , minKind))
256258 val scaffolding =
257- if (enumClass.typeParams.nonEmpty || kind >= seenKind) Nil
259+ if (kind >= seenKind) Nil
258260 else if (kind == CaseKind .Object ) enumScaffolding
259261 else if (seenKind == CaseKind .Object ) enumValueCreator :: Nil
260262 else enumScaffolding :+ enumValueCreator
@@ -288,8 +290,8 @@ object DesugarEnums {
288290 val toStringDef = toStringMethLit(name.toString)
289291 val impl1 = cpy.Template (impl)(
290292 parents = impl.parents :+ scalaRuntimeDot(tpnme.EnumValue ),
291- body = List ( ordinalDef, toStringDef) ++ registerCall)
292- .withAttachment(ExtendsSingletonMirror , ())
293+ body = ordinalDef :: toStringDef :: registerCall :: Nil
294+ ) .withAttachment(ExtendsSingletonMirror , ())
293295 val vdef = ValDef (name, TypeTree (), New (impl1)).withMods(mods.withAddedFlags(EnumValue , span))
294296 flatTree(scaffolding ::: vdef :: Nil ).withSpan(span)
295297 }
0 commit comments