summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/Enumeration.scala15
-rw-r--r--test/files/run/t1505.scala25
2 files changed, 40 insertions, 0 deletions
diff --git a/src/library/scala/Enumeration.scala b/src/library/scala/Enumeration.scala
index 6d6203e415..283c60beeb 100644
--- a/src/library/scala/Enumeration.scala
+++ b/src/library/scala/Enumeration.scala
@@ -130,6 +130,21 @@ abstract class Enumeration(initial: Int, names: String*) {
override def toString(): String = updateCache.mkString("{", ", ", "}")
+ /** Returns a Value from this Enumeration whose name matches
+ * the argument <var>s</var>.
+ * You must pass a String* set of names to the constructor,
+ * or initialize each Enumeration with Value(String),
+ * for valueOf to work.
+ * @param s an enumeration name
+ * @return <tt>Some(Value)</tt> if an enumeration's name matches <var>s</var>,
+ * else <tt>None</tt>
+ */
+ def valueOf(s:String) = {
+ var v: Option[Value] = None
+ for( e <- elements ) if (s == e.toString()) v = Some(e)
+ v
+ }
+
/** Creates a fresh value, part of this enumeration. */
protected final def Value: Value =
new Val(nextId, if (nextName.hasNext) nextName.next else null)
diff --git a/test/files/run/t1505.scala b/test/files/run/t1505.scala
new file mode 100644
index 0000000000..25c1a9117b
--- /dev/null
+++ b/test/files/run/t1505.scala
@@ -0,0 +1,25 @@
+object P extends Enumeration(0, "A", "B", "C") { val A, B, C = Value }
+
+object Q extends Enumeration {
+ val A = Value("A")
+ val B = Value("B")
+ val C = Value("C")
+}
+
+object R extends Enumeration {
+ val A, B, C = Value
+}
+
+object Test extends Application {
+ assert(Some(P(0)) == P.valueOf("A"))
+ assert(Some(P.C) == P.valueOf("C"))
+ assert(None == P.valueOf("Q"))
+
+ assert(Some(Q(0)) == Q.valueOf("A"))
+ assert(Some(Q.C) == Q.valueOf("C"))
+ assert(None == Q.valueOf("Q"))
+
+ assert(None == R.valueOf("A"))
+ assert(None == R.valueOf("C"))
+ assert(None == R.valueOf("Q"))
+}