Skip to content

Commit 624a6e0

Browse files
committed
Fix #8214 Don't consume whitespace after XML
Forward port of scala/scala#4185
1 parent 6bb218a commit 624a6e0

File tree

2 files changed

+49
-7
lines changed

2 files changed

+49
-7
lines changed

Diff for: compiler/src/dotty/tools/dotc/parsing/xml/MarkupParsers.scala

+7-7
Original file line numberDiff line numberDiff line change
@@ -362,18 +362,18 @@ object MarkupParsers {
362362
tmppos = Span(curOffset) // Iuli: added this line, as it seems content_LT uses tmppos when creating trees
363363
content_LT(ts)
364364

365-
// parse more XML ?
365+
// parse more XML?
366366
if (charComingAfter(xSpaceOpt()) == '<') {
367-
xSpaceOpt()
368-
while (ch == '<') {
369-
nextch()
370-
ts append element
367+
while {
371368
xSpaceOpt()
372-
}
369+
nextch()
370+
ts.append(element)
371+
charComingAfter(xSpaceOpt()) == '<'
372+
} do ()
373373
handle.makeXMLseq(Span(start, curOffset, start), ts)
374374
}
375375
else {
376-
assert(ts.length == 1)
376+
assert(ts.length == 1, "Require one tree")
377377
ts(0)
378378
}
379379
},

Diff for: tests/run/xml.scala

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
object Test {
3+
import scala.xml.NodeBuffer
4+
5+
def main(args: Array[String]): Unit = {
6+
val xml = <hello>world</hello>
7+
assert(xml.toString == "helloworld")
8+
val nodeBuffer: NodeBuffer = <hello/><world/>
9+
assert(nodeBuffer.mkString == "helloworld")
10+
}
11+
}
12+
package scala.xml {
13+
type MetaData = AnyRef
14+
15+
trait NamespaceBinding
16+
object TopScope extends NamespaceBinding
17+
object Null
18+
abstract class Node {
19+
def label: String
20+
def child: Seq[Node]
21+
override def toString = label + child.mkString
22+
}
23+
class Elem(prefix: String, val label: String, attributes1: MetaData, scope: NamespaceBinding, minimizeEmpty: Boolean, val child: Node*) extends Node
24+
class NodeBuffer extends Seq[Node] {
25+
val nodes = scala.collection.mutable.ArrayBuffer.empty[Node]
26+
def &+(o: Any): NodeBuffer =
27+
o match {
28+
case n: Node => nodes.addOne(n) ; this
29+
case t: Text => nodes.addOne(Atom(t)) ; this
30+
}
31+
// Members declared in scala.collection.IterableOnce
32+
def iterator: Iterator[scala.xml.Node] = nodes.iterator
33+
// Members declared in scala.collection.SeqOps
34+
def apply(i: Int): scala.xml.Node = nodes(i)
35+
def length: Int = nodes.length
36+
}
37+
case class Text(text: String)
38+
case class Atom(t: Text) extends Node {
39+
def label = t.text
40+
def child = Nil
41+
}
42+
}

0 commit comments

Comments
 (0)