@@ -74,30 +74,35 @@ object DesugarEnums {
74
74
else if (isEnumCase(cdef)) cdef.withMods(cdef.mods.withFlags(cdef.mods.flags | Final ))
75
75
else cdef
76
76
77
+ private def valuesDotTerm (name : TermName )(implicit src : SourceFile ) =
78
+ Select (Ident (nme.DOLLAR_VALUES ), name)
79
+
77
80
private def valuesDot (name : String )(implicit src : SourceFile ) =
78
- Select (Ident (nme.DOLLAR_VALUES ), name.toTermName)
81
+ valuesDotTerm(name.toTermName)
82
+
79
83
private def registerCall (implicit ctx : Context ): List [Tree ] =
80
84
if (enumClass.typeParams.nonEmpty) Nil
81
85
else Apply (valuesDot(" register" ), This (EmptyTypeIdent ) :: Nil ) :: Nil
82
86
83
87
/** The following lists of definitions for an enum type E:
84
88
*
85
89
* 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
89
92
*/
90
93
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 ))
93
96
val privateValuesDef =
94
97
ValDef (nme.DOLLAR_VALUES , TypeTree (),
95
98
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
101
106
}
102
107
103
108
/** A creation method for a value of enum type `E`, which is defined as follows:
@@ -110,8 +115,6 @@ object DesugarEnums {
110
115
* }
111
116
*/
112
117
private def enumValueCreator (implicit ctx : Context ) = {
113
- def param (name : TermName , typ : Type ) =
114
- ValDef (name, TypeTree (typ), EmptyTree ).withFlags(Param )
115
118
val ordinalDef = ordinalMeth(Ident (nme.tag))
116
119
val nameDef = nameMeth(Ident (nme.name_))
117
120
val creator = New (Template (
@@ -242,6 +245,9 @@ object DesugarEnums {
242
245
(count, scaffolding)
243
246
}
244
247
248
+ def param (name : TermName , typ : Type )(implicit ctx : Context ) =
249
+ ValDef (name, TypeTree (typ), EmptyTree ).withFlags(Param )
250
+
245
251
def ordinalMeth (body : Tree )(implicit ctx : Context ): DefDef =
246
252
DefDef (nme.ordinal, Nil , Nil , TypeTree (defn.IntType ), body).withFlags(Override )
247
253
0 commit comments