diff options
author | Paul Phillips <paulp@improving.org> | 2009-08-28 11:25:43 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-08-28 11:25:43 +0000 |
commit | 8814de2aa0fc14df0785dfa9ee96d154c32e5646 (patch) | |
tree | 87d828b2f937057f84239cbb4be67bce843ef483 | |
parent | e7bd2c9fe58e4d6bebc529614bd0ec11031d21d5 (diff) | |
download | scala-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.scala | 16 | ||||
-rw-r--r-- | test/files/run/bug2276.check | 8 | ||||
-rw-r--r-- | test/files/run/bug2276.scala | 24 |
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 |