Skip to content

Commit 17963bf

Browse files
Module methods for enums implemented
1 parent ecdaa4e commit 17963bf

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)