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