Skip to content

Commit 50d62f7

Browse files
authored
fix(#16458): regression in xml syntax parsing (#19522)
close #16458 xLiteral mistakenly assumed that the element just after `<` is always non-special element, but it is not true. It could be xCharData, comment, xProcInstr.
2 parents b9f2ef0 + 9de9d57 commit 50d62f7

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ object MarkupParsers {
373373
while {
374374
xSpaceOpt()
375375
nextch()
376-
ts.append(element)
376+
content_LT(ts)
377377
charComingAfter(xSpaceOpt()) == '<'
378378
} do ()
379379
handle.makeXMLseq(Span(start, curOffset, start), ts)

Diff for: tests/run/i16458.scala

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

0 commit comments

Comments
 (0)