diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala | 19 | ||||
-rw-r--r-- | test/files/jvm/unittest_xml.scala | 6 | ||||
-rw-r--r-- | test/files/neg/xmlcorner.scala | 16 | ||||
-rw-r--r-- | test/pending/jvm/backendBugUnapply.scala | 9 |
4 files changed, 41 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala index 3c1a7f3dd1..c63b701f85 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala @@ -31,10 +31,6 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean import p.{symbXMLBuilder => handle} import s.token - /** the XML tree factory */ - //final val handle: SymbolicXMLBuilder = p.symbXMLBuilder; - //new SymbolicXMLBuilder(unit.global.make, unit.global.treeGen, p, presWS); - /** holds the position in the source file */ /*[Duplicate]*/ var pos: Int = _ @@ -497,7 +493,7 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean */ def xLiteral: Tree = try { //Console.println("entering xLiteral!!") - init + init; pushScannerState handle.isPattern = false val pos = s.currentPos var lastend = 0 @@ -536,7 +532,8 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean //} //Console.println("out of xLiteral, parsed:"+tree.toString()); s.next.token = Tokens.EMPTY; - s.nextToken(); /* s.fetchToken(); */ + s.nextToken() + popScannerState tree } catch { @@ -552,13 +549,14 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean * precondition: s.xStartsXML == true */ def xLiteralPattern:Tree = try { - init; + init; pushScannerState val oldMode = handle.isPattern; handle.isPattern = true; var tree = xPattern; xSpaceOpt; handle.isPattern = oldMode; s.next.token = Tokens.EMPTY; s.nextToken() + popScannerState tree } catch { case _:ArrayIndexOutOfBoundsException => @@ -596,6 +594,13 @@ class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean def nextch: Unit = { s.in.next; /*s.xNext;*/ ch = s.in.ch ; pos = s.in.cpos; } //def lookahead = { s.xLookahead } + var scannerState: List[List[Int]] = Nil + + def pushScannerState { scannerState = s.sepRegions::scannerState } + def popScannerState { + s.sepRegions = scannerState.head; + scannerState = scannerState.tail + } def init: Unit = { ch = s.in.ch; diff --git a/test/files/jvm/unittest_xml.scala b/test/files/jvm/unittest_xml.scala index b6d3da00f5..312b69d529 100644 --- a/test/files/jvm/unittest_xml.scala +++ b/test/files/jvm/unittest_xml.scala @@ -7,7 +7,7 @@ object Test { class ParsingTest extends TestCase("scala.xml.Parsing") with Assert { override def runTest = { assertTrue(Parsing.isNameStart('b')) - assertTrue(Parsing.isNameStart(':')) + assertFalse(Parsing.isNameStart(':')) } } class MetaDataTest extends TestCase("scala.xml.MetaData") with Assert { @@ -17,7 +17,9 @@ object Test { def domatch(x:Node): Node = { val hasBar = new HasKeyValue("bar") x match { - case Node("foo", hasBar(z), _*) => z + //case Node("foo", hasBar(z), _*) => z + case Node("foo", md, _*) if !hasBar.unapplySeq(md).isEmpty => + md("bar")(0) case _ => new Atom(3) } } diff --git a/test/files/neg/xmlcorner.scala b/test/files/neg/xmlcorner.scala index 9f1c55bce4..042ec05e68 100644 --- a/test/files/neg/xmlcorner.scala +++ b/test/files/neg/xmlcorner.scala @@ -4,3 +4,19 @@ class foo { class bar { val wrong = <bla: /> } + +// this "pos" test is only included as a parser test +object pos +{ + def wrap(f : Int => Unit) = f(5) + + wrap({ v => + if(v == 5) { + val n = { + val m = (<a>{}</a>) + <div>{ v }</div> + } + () + } + }) +} diff --git a/test/pending/jvm/backendBugUnapply.scala b/test/pending/jvm/backendBugUnapply.scala new file mode 100644 index 0000000000..f8abfeb713 --- /dev/null +++ b/test/pending/jvm/backendBugUnapply.scala @@ -0,0 +1,9 @@ +object Test { import scala.xml.{Node,HasKeyValue} + def domatch(x:Node): Node = { + val hasBar = new HasKeyValue("bar") + x match { + case Node("foo", hasBar(z), _*) => z + case _ => null + } + } +} |