@@ -74,30 +74,35 @@ object DesugarEnums {
7474 else if (isEnumCase(cdef)) cdef.withMods(cdef.mods.withFlags(cdef.mods.flags | Final ))
7575 else cdef
7676
77+ private def valuesDotTerm (name : TermName )(implicit src : SourceFile ) =
78+ Select (Ident (nme.DOLLAR_VALUES ), name)
79+
7780 private def valuesDot (name : String )(implicit src : SourceFile ) =
78- Select (Ident (nme.DOLLAR_VALUES ), name.toTermName)
81+ valuesDotTerm(name.toTermName)
82+
7983 private def registerCall (implicit ctx : Context ): List [Tree ] =
8084 if (enumClass.typeParams.nonEmpty) Nil
8185 else Apply (valuesDot(" register" ), This (EmptyTypeIdent ) :: Nil ) :: Nil
8286
8387 /** The following lists of definitions for an enum type E:
8488 *
8589 * private val $values = new EnumValues[E]
86- * def enumValue = $values.fromInt
87- * def enumValueNamed = $values.fromName
88- * def enumValues = $values.values
90+ * def valueOf = $values.fromName
91+ * def values = $values.values.toArray
8992 */
9093 private def enumScaffolding (implicit ctx : Context ): List [Tree ] = {
91- def enumDefDef ( name : String , select : String ) =
92- DefDef (name.toTermName , Nil , Nil , TypeTree (), valuesDot(select ))
94+ val valuesDef =
95+ DefDef (nme.values , Nil , Nil , TypeTree (), Select (valuesDotTerm(nme.values), nme.toArray ))
9396 val privateValuesDef =
9497 ValDef (nme.DOLLAR_VALUES , TypeTree (),
9598 New (TypeTree (defn.EnumValuesType .appliedTo(enumClass.typeRef :: Nil )), ListOfNil ))
96- .withFlags(Private )
97- val valueOfDef = enumDefDef(" enumValue" , " fromInt" )
98- val withNameDef = enumDefDef(" enumValueNamed" , " fromName" )
99- val valuesDef = enumDefDef(" enumValues" , " values" )
100- List (privateValuesDef, valueOfDef, withNameDef, valuesDef)
99+ .withFlags(Private )
100+ val valueOfDef = DefDef (nme.valueOf, Nil , List (param(nme.name, defn.StringType ) :: Nil ),
101+ TypeTree (), Apply (valuesDot(" fromName" ), Ident (nme.name) :: Nil ))
102+
103+ valuesDef ::
104+ privateValuesDef ::
105+ valueOfDef :: Nil
101106 }
102107
103108 /** A creation method for a value of enum type `E`, which is defined as follows:
@@ -110,8 +115,6 @@ object DesugarEnums {
110115 * }
111116 */
112117 private def enumValueCreator (implicit ctx : Context ) = {
113- def param (name : TermName , typ : Type ) =
114- ValDef (name, TypeTree (typ), EmptyTree ).withFlags(Param )
115118 val ordinalDef = ordinalMeth(Ident (nme.tag))
116119 val nameDef = nameMeth(Ident (nme.name_))
117120 val creator = New (Template (
@@ -242,6 +245,9 @@ object DesugarEnums {
242245 (count, scaffolding)
243246 }
244247
248+ def param (name : TermName , typ : Type )(implicit ctx : Context ) =
249+ ValDef (name, TypeTree (typ), EmptyTree ).withFlags(Param )
250+
245251 def ordinalMeth (body : Tree )(implicit ctx : Context ): DefDef =
246252 DefDef (nme.ordinal, Nil , Nil , TypeTree (defn.IntType ), body).withFlags(Override )
247253
0 commit comments