From 624a6e08619b725cd32b1bade06d6c814225cd0f Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Thu, 6 Feb 2020 06:51:41 -0800 Subject: [PATCH] Fix #8214 Don't consume whitespace after XML Forward port of https://github.com/scala/scala/pull/4185 --- .../dotc/parsing/xml/MarkupParsers.scala | 14 +++---- tests/run/xml.scala | 42 +++++++++++++++++++ 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 tests/run/xml.scala diff --git a/compiler/src/dotty/tools/dotc/parsing/xml/MarkupParsers.scala b/compiler/src/dotty/tools/dotc/parsing/xml/MarkupParsers.scala index cef9cb488a4e..64f54aa0b521 100644 --- a/compiler/src/dotty/tools/dotc/parsing/xml/MarkupParsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/xml/MarkupParsers.scala @@ -362,18 +362,18 @@ object MarkupParsers { tmppos = Span(curOffset) // Iuli: added this line, as it seems content_LT uses tmppos when creating trees content_LT(ts) - // parse more XML ? + // parse more XML? if (charComingAfter(xSpaceOpt()) == '<') { - xSpaceOpt() - while (ch == '<') { - nextch() - ts append element + while { xSpaceOpt() - } + nextch() + ts.append(element) + charComingAfter(xSpaceOpt()) == '<' + } do () handle.makeXMLseq(Span(start, curOffset, start), ts) } else { - assert(ts.length == 1) + assert(ts.length == 1, "Require one tree") ts(0) } }, diff --git a/tests/run/xml.scala b/tests/run/xml.scala new file mode 100644 index 000000000000..a1ff9998ec93 --- /dev/null +++ b/tests/run/xml.scala @@ -0,0 +1,42 @@ + +object Test { + import scala.xml.NodeBuffer + + def main(args: Array[String]): Unit = { + val xml = world + assert(xml.toString == "helloworld") + val nodeBuffer: NodeBuffer = + assert(nodeBuffer.mkString == "helloworld") + } +} +package scala.xml { + type MetaData = AnyRef + + trait NamespaceBinding + object TopScope extends NamespaceBinding + object Null + abstract class Node { + def label: String + def child: Seq[Node] + override def toString = label + child.mkString + } + class Elem(prefix: String, val label: String, attributes1: MetaData, scope: NamespaceBinding, minimizeEmpty: Boolean, val child: Node*) extends Node + class NodeBuffer extends Seq[Node] { + val nodes = scala.collection.mutable.ArrayBuffer.empty[Node] + def &+(o: Any): NodeBuffer = + o match { + case n: Node => nodes.addOne(n) ; this + case t: Text => nodes.addOne(Atom(t)) ; this + } + // Members declared in scala.collection.IterableOnce + def iterator: Iterator[scala.xml.Node] = nodes.iterator + // Members declared in scala.collection.SeqOps + def apply(i: Int): scala.xml.Node = nodes(i) + def length: Int = nodes.length + } + case class Text(text: String) + case class Atom(t: Text) extends Node { + def label = t.text + def child = Nil + } +}