summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-12-01 15:57:52 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-12-01 16:09:38 +0100
commit32b756494e7a6316156e6915827ac986b91b3997 (patch)
tree8a05447d65123257dace5d1afd78c739bec837bc
parent073ebbd20ce9775260b83a78ecf9ed6a3e6d3d9e (diff)
downloadscala-32b756494e7a6316156e6915827ac986b91b3997.tar.gz
scala-32b756494e7a6316156e6915827ac986b91b3997.tar.bz2
scala-32b756494e7a6316156e6915827ac986b91b3997.zip
SI-8022 Backwards compatibility for Regex#unapplySeq
The change in ce1bbfe / SI-6406 introduced overloads of `unapplySeq` with wider static and dynmaic result types than the now-deprecated alternative that accepted `Any`. This is subtly source incompatible and the change was noticed in Specs2. This commit uses `List` as the static and runtime type for the new overloads. For consistency, the same is done for the new method added in SI-7737 / 93e9623.
-rw-r--r--src/library/scala/util/matching/Regex.scala12
-rw-r--r--test/junit/scala/util/matching/RegexTest.scala30
2 files changed, 36 insertions, 6 deletions
diff --git a/src/library/scala/util/matching/Regex.scala b/src/library/scala/util/matching/Regex.scala
index 439b30e714..22dbb37789 100644
--- a/src/library/scala/util/matching/Regex.scala
+++ b/src/library/scala/util/matching/Regex.scala
@@ -188,9 +188,9 @@ class Regex private[matching](val pattern: Pattern, groupNames: String*) extends
* @param s The string to match
* @return The matches
*/
- def unapplySeq(s: CharSequence): Option[Seq[String]] = {
+ def unapplySeq(s: CharSequence): Option[List[String]] = {
val m = pattern matcher s
- if (runMatcher(m)) Some(1 to m.groupCount map m.group)
+ if (runMatcher(m)) Some((1 to m.groupCount).toList map m.group)
else None
}
@@ -225,10 +225,10 @@ class Regex private[matching](val pattern: Pattern, groupNames: String*) extends
* @param c The Char to match
* @return The match
*/
- def unapplySeq(c: Char): Option[Seq[Char]] = {
+ def unapplySeq(c: Char): Option[List[Char]] = {
val m = pattern matcher c.toString
if (runMatcher(m)) {
- if (m.groupCount > 0) Some(m group 1) else Some(Nil)
+ if (m.groupCount > 0) Some((m group 1).toList) else Some(Nil)
} else None
}
@@ -238,9 +238,9 @@ class Regex private[matching](val pattern: Pattern, groupNames: String*) extends
* Otherwise, this Regex is applied to the previously matched input,
* and the result of that match is used.
*/
- def unapplySeq(m: Match): Option[Seq[String]] =
+ def unapplySeq(m: Match): Option[List[String]] =
if (m.matched == null) None
- else if (m.matcher.pattern == this.pattern) Some(1 to m.groupCount map m.group)
+ else if (m.matcher.pattern == this.pattern) Some((1 to m.groupCount).toList map m.group)
else unapplySeq(m.matched)
/** Tries to match target.
diff --git a/test/junit/scala/util/matching/RegexTest.scala b/test/junit/scala/util/matching/RegexTest.scala
new file mode 100644
index 0000000000..d25842cc57
--- /dev/null
+++ b/test/junit/scala/util/matching/RegexTest.scala
@@ -0,0 +1,30 @@
+
+package scala.util.matching
+
+import org.junit.Assert._
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(classOf[JUnit4])
+class RegexTest {
+ @Test def t8022CharSequence(): Unit = {
+ val full = """.*: (.)$""".r
+ val text = " When I use this operator: *"
+ // Testing 2.10.x compatibility of the return types of unapplySeq
+ val x :: Nil = full.unapplySeq(text: Any).get
+ val y :: Nil = full.unapplySeq(text: CharSequence).get
+ assertEquals("*", x)
+ assertEquals("*", y)
+ }
+
+ @Test def t8022Match(): Unit = {
+ val R = """(\d)""".r
+ val matchh = R.findFirstMatchIn("a1").get
+ // Testing 2.10.x compatibility of the return types of unapplySeq
+ val x :: Nil = R.unapplySeq(matchh: Any).get
+ val y :: Nil = R.unapplySeq(matchh).get
+ assertEquals("1", x)
+ assertEquals("1", y)
+ }
+}