Skip to content

Commit 8103650

Browse files
committed
match on string for valueOf
1 parent 786e6f3 commit 8103650

File tree

3 files changed

+16
-44
lines changed

3 files changed

+16
-44
lines changed

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

+15-33
Original file line numberDiff line numberDiff line change
@@ -101,18 +101,15 @@ object DesugarEnums {
101101
/** The following lists of definitions for an enum type E and known value cases e_0, ..., e_n:
102102
*
103103
* private val $values = Array[E](e_0,...,e_n)(ClassTag[E](classOf[E]))
104-
* @annotation.threadUnsafe private lazy val $valuesReverse =
105-
* scala.runtime.ScalaRuntime.wrapRefArray($values).map((x_0: E) => (x_0.enumLabel, x_0)).toMap
106104
* def values = $values.clone
107-
* def valueOf($name: String) =
108-
* try $valuesReverse($name) catch
109-
* {
110-
* case ex$: NoSuchElementException =>
111-
* throw new IllegalArgumentException("enum case not found: " + $name)
112-
* }
105+
* def valueOf($name: String) = $name match {
106+
* case "e_0" => e_0
107+
* ...
108+
* case "e_n" => e_n
109+
* case _ => throw new IllegalArgumentException("case not found: " + $name)
110+
* }
113111
*/
114112
private def enumScaffolding(enumCases: List[(Int, TermName)])(using Context): List[Tree] = {
115-
import dotty.tools.dotc.transform.SymUtils.rawTypeRef
116113
val rawEnumClassRef = rawRef(enumClass.typeRef)
117114
extension (tpe: NamedType) def ofRawEnum = AppliedTypeTree(ref(tpe), rawEnumClassRef)
118115

@@ -121,39 +118,24 @@ object DesugarEnums {
121118
ArrayLiteral(enumCases.map((_, name) => Ident(name)), rawEnumClassRef))
122119
.withFlags(Private | Synthetic)
123120

124-
val privateReverseValuesDef =
125-
val wrapped = Apply(Select(ref(defn.ScalaRuntimeModule.termRef), nme.wrapRefArray), Ident(nme.DOLLAR_VALUES))
126-
val mapper =
127-
val paramName = nme.syntheticParamName(0)
128-
val paramDef = param(paramName, rawEnumClassRef)
129-
Function(paramDef :: Nil, Tuple(Select(Ident(paramName), nme.enumLabel) :: Ident(paramName) :: Nil))
130-
val mapBody = Select(Apply(Select(wrapped, nme.map), mapper), nme.toMap)
131-
val annot = New(ref(defn.ThreadUnsafeAnnot.typeRef), Nil).withSpan(ctx.tree.span)
132-
ValDef(nme.DOLLAR_VALUES_REVERSE, TypeTree(), mapBody)
133-
.withFlags(Private | Synthetic | Lazy).withAnnotations(annot :: Nil)
134-
135121
val valuesDef =
136122
DefDef(nme.values, Nil, Nil, defn.ArrayType.ofRawEnum, valuesDot(nme.clone_))
137123
.withFlags(Synthetic)
138124

139-
val valuesOfExnMessage = Apply(
140-
Select(Literal(Constant("enum case not found: ")), nme.PLUS), Ident(nme.nameDollar))
141-
142-
val valuesOfBody = Try(
143-
expr = Apply(Ident(nme.DOLLAR_VALUES_REVERSE), Ident(nme.nameDollar) :: Nil),
144-
cases = CaseDef(
145-
pat = Typed(Ident(nme.DEFAULT_EXCEPTION_NAME), TypeTree(defn.NoSuchElementExceptionType)),
146-
guard = EmptyTree,
147-
body = Throw(New(TypeTree(defn.IllegalArgumentExceptionType), List(valuesOfExnMessage :: Nil)))
148-
) :: Nil,
149-
finalizer = EmptyTree
150-
)
125+
val valuesOfBody: Tree =
126+
val defaultCase =
127+
val msg = Apply(Select(Literal(Constant("enum case not found: ")), nme.PLUS), Ident(nme.nameDollar))
128+
CaseDef(Ident(nme.WILDCARD), EmptyTree,
129+
Throw(New(TypeTree(defn.IllegalArgumentExceptionType), List(msg :: Nil))))
130+
val stringCases = enumCases.map((_, name) =>
131+
CaseDef(Literal(Constant(name.toString)), EmptyTree, Ident(name))
132+
) ::: defaultCase :: Nil
133+
Match(Ident(nme.nameDollar), stringCases)
151134
val valueOfDef = DefDef(nme.valueOf, Nil, List(param(nme.nameDollar, defn.StringType) :: Nil),
152135
TypeTree(), valuesOfBody)
153136
.withFlags(Synthetic)
154137

155138
privateValuesDef ::
156-
privateReverseValuesDef ::
157139
valuesDef ::
158140
valueOfDef :: Nil
159141
}

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

-2
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>"
@@ -599,7 +598,6 @@ object StdNames {
599598
val toArray: N = "toArray"
600599
val toExpr: N = "toExpr"
601600
val toList: N = "toList"
602-
val toMap: N = "toMap"
603601
val toObjectArray : N = "toObjectArray"
604602
val toSeq: N = "toSeq"
605603
val toString_ : N = "toString"

tests/semanticdb/metac.expect

+1-9
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ Schema => SemanticDB v4
641641
Uri => Enums.scala
642642
Text => empty
643643
Language => Scala
644-
Symbols => 191 entries
644+
Symbols => 183 entries
645645
Occurrences => 203 entries
646646

647647
Symbols:
@@ -654,7 +654,6 @@ _empty_/Enums.Coin. => final object Coin
654654
_empty_/Enums.Coin.$fromOrdinal(). => method $fromOrdinal
655655
_empty_/Enums.Coin.$fromOrdinal().(_$ordinal) => param _$ordinal
656656
_empty_/Enums.Coin.$values. => val method $values
657-
_empty_/Enums.Coin.$valuesReverse. => lazy val method $valuesReverse
658657
_empty_/Enums.Coin.Dime. => case val static enum method Dime
659658
_empty_/Enums.Coin.Dollar. => case val static enum method Dollar
660659
_empty_/Enums.Coin.Nickel. => case val static enum method Nickel
@@ -672,7 +671,6 @@ _empty_/Enums.Colour.$new(). => method $new
672671
_empty_/Enums.Colour.$new().($name) => param $name
673672
_empty_/Enums.Colour.$new().(_$ordinal) => param _$ordinal
674673
_empty_/Enums.Colour.$values. => val method $values
675-
_empty_/Enums.Colour.$valuesReverse. => lazy val method $valuesReverse
676674
_empty_/Enums.Colour.Blue. => case val static enum method Blue
677675
_empty_/Enums.Colour.Green. => case val static enum method Green
678676
_empty_/Enums.Colour.Red. => case val static enum method Red
@@ -688,7 +686,6 @@ _empty_/Enums.Directions.$new(). => method $new
688686
_empty_/Enums.Directions.$new().($name) => param $name
689687
_empty_/Enums.Directions.$new().(_$ordinal) => param _$ordinal
690688
_empty_/Enums.Directions.$values. => val method $values
691-
_empty_/Enums.Directions.$valuesReverse. => lazy val method $valuesReverse
692689
_empty_/Enums.Directions.East. => case val static enum method East
693690
_empty_/Enums.Directions.North. => case val static enum method North
694691
_empty_/Enums.Directions.South. => case val static enum method South
@@ -703,7 +700,6 @@ _empty_/Enums.Maybe. => final object Maybe
703700
_empty_/Enums.Maybe.$fromOrdinal(). => method $fromOrdinal
704701
_empty_/Enums.Maybe.$fromOrdinal().(_$ordinal) => param _$ordinal
705702
_empty_/Enums.Maybe.$values. => val method $values
706-
_empty_/Enums.Maybe.$valuesReverse. => lazy val method $valuesReverse
707703
_empty_/Enums.Maybe.Just# => final case enum class Just
708704
_empty_/Enums.Maybe.Just#[A] => typeparam A
709705
_empty_/Enums.Maybe.Just#_1(). => method _1
@@ -741,7 +737,6 @@ _empty_/Enums.Planet#surfaceWeight(). => method surfaceWeight
741737
_empty_/Enums.Planet#surfaceWeight().(otherMass) => param otherMass
742738
_empty_/Enums.Planet. => final object Planet
743739
_empty_/Enums.Planet.$values. => val method $values
744-
_empty_/Enums.Planet.$valuesReverse. => lazy val method $valuesReverse
745740
_empty_/Enums.Planet.Earth. => case val static enum method Earth
746741
_empty_/Enums.Planet.Jupiter. => case val static enum method Jupiter
747742
_empty_/Enums.Planet.Mars. => case val static enum method Mars
@@ -762,7 +757,6 @@ _empty_/Enums.Suits.$new(). => method $new
762757
_empty_/Enums.Suits.$new().($name) => param $name
763758
_empty_/Enums.Suits.$new().(_$ordinal) => param _$ordinal
764759
_empty_/Enums.Suits.$values. => val method $values
765-
_empty_/Enums.Suits.$valuesReverse. => lazy val method $valuesReverse
766760
_empty_/Enums.Suits.Clubs. => case val static enum method Clubs
767761
_empty_/Enums.Suits.Diamonds. => case val static enum method Diamonds
768762
_empty_/Enums.Suits.Hearts. => case val static enum method Hearts
@@ -782,7 +776,6 @@ _empty_/Enums.Tag. => final object Tag
782776
_empty_/Enums.Tag.$fromOrdinal(). => method $fromOrdinal
783777
_empty_/Enums.Tag.$fromOrdinal().(_$ordinal) => param _$ordinal
784778
_empty_/Enums.Tag.$values. => val method $values
785-
_empty_/Enums.Tag.$valuesReverse. => lazy val method $valuesReverse
786779
_empty_/Enums.Tag.BooleanTag. => case val static enum method BooleanTag
787780
_empty_/Enums.Tag.IntTag. => case val static enum method IntTag
788781
_empty_/Enums.Tag.valueOf(). => method valueOf
@@ -797,7 +790,6 @@ _empty_/Enums.WeekDays.$new(). => method $new
797790
_empty_/Enums.WeekDays.$new().($name) => param $name
798791
_empty_/Enums.WeekDays.$new().(_$ordinal) => param _$ordinal
799792
_empty_/Enums.WeekDays.$values. => val method $values
800-
_empty_/Enums.WeekDays.$valuesReverse. => lazy val method $valuesReverse
801793
_empty_/Enums.WeekDays.Friday. => case val static enum method Friday
802794
_empty_/Enums.WeekDays.Monday. => case val static enum method Monday
803795
_empty_/Enums.WeekDays.Saturday. => case val static enum method Saturday

0 commit comments

Comments
 (0)