summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2009-08-28 11:25:43 +0000
committerPaul Phillips <paulp@improving.org>2009-08-28 11:25:43 +0000
commit8814de2aa0fc14df0785dfa9ee96d154c32e5646 (patch)
tree87d828b2f937057f84239cbb4be67bce843ef483
parente7bd2c9fe58e4d6bebc529614bd0ec11031d21d5 (diff)
downloadscala-8814de2aa0fc14df0785dfa9ee96d154c32e5646.tar.gz
scala-8814de2aa0fc14df0785dfa9ee96d154c32e5646.tar.bz2
scala-8814de2aa0fc14df0785dfa9ee96d154c32e5646.zip
Fix and test case for #2276.
-rw-r--r--src/library/scala/xml/transform/BasicTransformer.scala16
-rw-r--r--test/files/run/bug2276.check8
-rw-r--r--test/files/run/bug2276.scala24
3 files changed, 36 insertions, 12 deletions
diff --git a/src/library/scala/xml/transform/BasicTransformer.scala b/src/library/scala/xml/transform/BasicTransformer.scala
index 917884617c..a79c32a5f0 100644
--- a/src/library/scala/xml/transform/BasicTransformer.scala
+++ b/src/library/scala/xml/transform/BasicTransformer.scala
@@ -25,7 +25,7 @@ abstract class BasicTransformer extends Function1[Node,Node]
* @return ...
*/
protected def unchanged(n: Node, ns: Seq[Node]) =
- ns.length == 1 && (ns.head eq n)
+ ns.length == 1 && (ns.head == n)
/** Call transform(Node) for each node in ns, append results
* to NodeBuffer.
@@ -37,18 +37,10 @@ abstract class BasicTransformer extends Function1[Node,Node]
* otherwise a new sequence of concatenated results.
*/
def transform(ns: Seq[Node]): Seq[Node] = {
- def testForChange(n: Node): Option[Seq[Node]] = {
- val n2 = transform(n)
- if (unchanged(n, n2)) None
- else Some(n2)
- }
- // if any node is changed by the transform, concatenate
- // the unchanged nodes with a recursive call.
- for ((n, i) <- ns.zipWithIndex ; n2 <- testForChange(n))
- return (ns take i) ++ transform(n2)
+ val (xs1, xs2) = ns span (n => unchanged(n, transform(n)))
- // no change, return original sequence
- ns
+ if (xs2.isEmpty) ns
+ else xs1 ++ transform(xs2.head) ++ transform(xs2.tail)
}
def transform(n: Node): Seq[Node] = {
diff --git a/test/files/run/bug2276.check b/test/files/run/bug2276.check
new file mode 100644
index 0000000000..95f51c8e29
--- /dev/null
+++ b/test/files/run/bug2276.check
@@ -0,0 +1,8 @@
+<root>
+ <subnode>
+ <version>2</version>
+ </subnode>
+ <contents>
+ <version>2</version>
+ </contents>
+ </root>
diff --git a/test/files/run/bug2276.scala b/test/files/run/bug2276.scala
new file mode 100644
index 0000000000..815e88e429
--- /dev/null
+++ b/test/files/run/bug2276.scala
@@ -0,0 +1,24 @@
+import scala.xml._
+import scala.xml.transform._
+
+object Test extends Application {
+ val inputXml : Node =
+ <root>
+ <subnode>
+ <version>1</version>
+ </subnode>
+ <contents>
+ <version>1</version>
+ </contents>
+ </root>
+
+ object t1 extends RewriteRule {
+ override def transform(n: Node): Seq[Node] = n match {
+ case <version>{x}</version> if x.toString.toInt < 4 => <version>{x.toString.toInt+1}</version>
+ case other => other
+ }
+ }
+
+ val ruleTransformer = new RuleTransformer(t1)
+ println(ruleTransformer(inputXml))
+} \ No newline at end of file