@@ -86,7 +86,12 @@ object DesugarEnums {
86
86
/** The following lists of definitions for an enum type E:
87
87
*
88
88
* private val $values = new EnumValues[E]
89
- * def valueOf = $values.fromName
89
+ * def valueOf(name: String) =
90
+ * try $values.fromName(name) catch
91
+ * {
92
+ * case ex$:NoSuchElementException =>
93
+ * throw new IllegalArgumentException("key not found: ".concat(name))
94
+ * }
90
95
* def values = $values.values.toArray
91
96
*/
92
97
private def enumScaffolding (implicit ctx : Context ): List [Tree ] = {
@@ -95,9 +100,22 @@ object DesugarEnums {
95
100
val privateValuesDef =
96
101
ValDef (nme.DOLLAR_VALUES , TypeTree (),
97
102
New (TypeTree (defn.EnumValuesType .appliedTo(enumClass.typeRef :: Nil )), ListOfNil ))
98
- .withFlags(Private )
103
+ .withFlags(Private )
104
+
105
+ val valuesOfExnMessage = Apply (
106
+ Select (Literal (Constant (" key not found: " )), " concat" .toTermName)
107
+ , Ident (nme.name) :: Nil )
108
+ val valuesOfBody = Try (
109
+ expr = Apply (valuesDot(" fromName" ), Ident (nme.name) :: Nil )
110
+ , cases = CaseDef (
111
+ pat = Typed (Ident (nme.DEFAULT_EXCEPTION_NAME ), TypeTree (defn.NoSuchElementExceptionType ))
112
+ , guard = EmptyTree
113
+ , body = Throw (New (TypeTree (defn.IllegalArgumentExceptionType ), List (valuesOfExnMessage :: Nil )))
114
+ ) :: Nil
115
+ , finalizer = EmptyTree
116
+ )
99
117
val valueOfDef = DefDef (nme.valueOf, Nil , List (param(nme.name, defn.StringType ) :: Nil ),
100
- TypeTree (), Apply (valuesDot( " fromName " ), Ident (nme.name) :: Nil ) )
118
+ TypeTree (), valuesOfBody )
101
119
102
120
valuesDef ::
103
121
privateValuesDef ::
0 commit comments