From 8814de2aa0fc14df0785dfa9ee96d154c32e5646 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Fri, 28 Aug 2009 11:25:43 +0000 Subject: Fix and test case for #2276. --- .../scala/xml/transform/BasicTransformer.scala | 16 ++++----------- test/files/run/bug2276.check | 8 ++++++++ test/files/run/bug2276.scala | 24 ++++++++++++++++++++++ 3 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 test/files/run/bug2276.check create mode 100644 test/files/run/bug2276.scala 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 @@ + + + 2 + + + 2 + + 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 = + + + 1 + + + 1 + + + + object t1 extends RewriteRule { + override def transform(n: Node): Seq[Node] = n match { + case {x} if x.toString.toInt < 4 => {x.toString.toInt+1} + case other => other + } + } + + val ruleTransformer = new RuleTransformer(t1) + println(ruleTransformer(inputXml)) +} \ No newline at end of file -- cgit v1.2.3