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