Skip to content

Commit bb0cc13

Browse files
committed
match on string for valueOf
1 parent e3a6237 commit bb0cc13

File tree

2 files changed

+18
-33
lines changed

2 files changed

+18
-33
lines changed

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

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -95,58 +95,44 @@ object DesugarEnums {
9595
/** The following lists of definitions for an enum type E and known value cases e_0, ..., e_n:
9696
*
9797
* private val $values = [e_0, ..., e_n : E]
98-
* @annotation.threadUnsafe private lazy val $valuesReverse =
99-
* scala.runtime.ScalaRuntime.wrapRefArray($values).map((x_0: E) => (x_0.enumLabel, x_0)).toMap
10098
* def values = $values.clone
101-
* def valueOf($name: String) =
102-
* try $valuesReverse($name) catch
103-
* {
104-
* case ex$: NoSuchElementException =>
105-
* throw new IllegalArgumentException("enum case not found: " + $name)
106-
* }
99+
* def valueOf($name: String) = $name match {
100+
* case "e_0" => e_0
101+
* ...
102+
* case "e_n" => e_n
103+
* case _ => throw new IllegalArgumentException("case not found: " + $name)
104+
* }
107105
*/
108106
private def enumScaffolding(enumCases: List[(Int, TermName)])(using Context): List[Tree] = {
109107
import dotty.tools.dotc.transform.SymUtils.rawTypeRef
108+
109+
def const(arg: String | Int | Null | Unit) = Literal(Constant(arg))
110+
110111
val rawEnumClassRef = rawRef(enumClass.typeRef)
111112
extension (tpe: NamedType) def ofRawEnum = AppliedTypeTree(ref(tpe), rawEnumClassRef)
112113

113114
val privateValuesDef =
114115
ValDef(nme.DOLLAR_VALUES, TypeTree(), JavaSeqLiteral(enumCases.map((_, name) => Ident(name)), rawEnumClassRef))
115116
.withFlags(Private | Synthetic)
116117

117-
val privateReverseValuesDef =
118-
val wrapped = Apply(Select(ref(defn.ScalaRuntimeModule.termRef), nme.wrapRefArray), Ident(nme.DOLLAR_VALUES))
119-
val mapper =
120-
val paramName = nme.syntheticParamName(0)
121-
val paramDef = param(paramName, rawEnumClassRef)
122-
Function(paramDef :: Nil, Tuple(Select(Ident(paramName), nme.enumLabel) :: Ident(paramName) :: Nil))
123-
val mapBody = Select(Apply(Select(wrapped, nme.map), mapper), nme.toMap)
124-
val annot = New(ref(defn.ThreadUnsafeAnnot.typeRef), Nil).withSpan(ctx.tree.span)
125-
ValDef(nme.DOLLAR_VALUES_REVERSE, TypeTree(), mapBody)
126-
.withFlags(Private | Synthetic | Lazy).withAnnotations(annot :: Nil)
127-
128118
val valuesDef =
129119
DefDef(nme.values, Nil, Nil, defn.ArrayType.ofRawEnum, valuesDot(nme.clone_))
130120
.withFlags(Synthetic)
131121

132-
val valuesOfExnMessage = Apply(
133-
Select(Literal(Constant("enum case not found: ")), nme.PLUS), Ident(nme.nameDollar))
134-
135-
val valuesOfBody = Try(
136-
expr = Apply(Ident(nme.DOLLAR_VALUES_REVERSE), Ident(nme.nameDollar) :: Nil),
137-
cases = CaseDef(
138-
pat = Typed(Ident(nme.DEFAULT_EXCEPTION_NAME), TypeTree(defn.NoSuchElementExceptionType)),
139-
guard = EmptyTree,
140-
body = Throw(New(TypeTree(defn.IllegalArgumentExceptionType), List(valuesOfExnMessage :: Nil)))
141-
) :: Nil,
142-
finalizer = EmptyTree
143-
)
122+
val valuesOfBody: Tree =
123+
val defaultCase =
124+
val msg = Apply(Select(const("enum case not found: "), nme.PLUS), Ident(nme.nameDollar))
125+
CaseDef(Ident(nme.WILDCARD), EmptyTree,
126+
Throw(New(TypeTree(defn.IllegalArgumentExceptionType), List(msg :: Nil))))
127+
val stringCases = enumCases.map((_, name) =>
128+
CaseDef(const(name.toString), EmptyTree, Ident(name))
129+
) ::: defaultCase :: Nil
130+
Match(Ident(nme.nameDollar), stringCases)
144131
val valueOfDef = DefDef(nme.valueOf, Nil, List(param(nme.nameDollar, defn.StringType) :: Nil),
145132
TypeTree(), valuesOfBody)
146133
.withFlags(Synthetic)
147134

148135
privateValuesDef ::
149-
privateReverseValuesDef ::
150136
valuesDef ::
151137
valueOfDef :: Nil
152138
}

compiler/src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ object StdNames {
123123
val DEFAULT_GETTER_INIT: N = "$lessinit$greater"
124124
val DO_WHILE_PREFIX: N = "doWhile$"
125125
val DOLLAR_VALUES: N = "$values"
126-
val DOLLAR_VALUES_REVERSE: N = "$valuesReverse"
127126
val DOLLAR_NEW: N = "$new"
128127
val EMPTY: N = ""
129128
val EMPTY_PACKAGE: N = "<empty>"

0 commit comments

Comments
 (0)