@@ -86,7 +86,12 @@ object DesugarEnums {
8686 /** The following lists of definitions for an enum type E:
8787 *
8888 * 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+ * }
9095 * def values = $values.values.toArray
9196 */
9297 private def enumScaffolding (implicit ctx : Context ): List [Tree ] = {
@@ -95,9 +100,22 @@ object DesugarEnums {
95100 val privateValuesDef =
96101 ValDef (nme.DOLLAR_VALUES , TypeTree (),
97102 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+ )
99117 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 )
101119
102120 valuesDef ::
103121 privateValuesDef ::
0 commit comments