diff options
author | Miles Sabin <miles@milessabin.com> | 2009-08-25 17:28:33 +0000 |
---|---|---|
committer | Miles Sabin <miles@milessabin.com> | 2009-08-25 17:28:33 +0000 |
commit | 7224d1c26def0519cab9c31c77f02f0ab5734838 (patch) | |
tree | ea69bc7b8696ca5dbe16b621367a2b0f1ee58d3d | |
parent | ac290525356e1db8408e4c6b2034103805783dec (diff) | |
download | scala-7224d1c26def0519cab9c31c77f02f0ab5734838.tar.gz scala-7224d1c26def0519cab9c31c77f02f0ab5734838.tar.bz2 scala-7224d1c26def0519cab9c31c77f02f0ab5734838.zip |
Fix for #2275 with tests.
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala | 12 | ||||
-rwxr-xr-x | src/compiler/scala/tools/nsc/ast/parser/Parsers.scala | 12 | ||||
-rw-r--r-- | test/files/neg/bug2275a.check | 13 | ||||
-rw-r--r-- | test/files/neg/bug2275a.scala | 7 | ||||
-rw-r--r-- | test/files/neg/bug2275b.check | 13 | ||||
-rw-r--r-- | test/files/neg/bug2275b.scala | 3 |
6 files changed, 52 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala index b1b9b81145..9ef982f815 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala @@ -489,18 +489,18 @@ trait MarkupParsers {self: Parsers => var exit = false val buf = new StringBuilder while (!exit && (ch!=SU)) { - buf append ch val expectRBRACE = ch == '}' - // TODO check for "}}" - nextch if (expectRBRACE) { - if (ch == '}') - nextch - else { + val la = input.lookaheadReader + la.nextChar() + if (la.ch != '}') { reportSyntaxError("in XML content, please use '}}' to express '}'") throw ConfusedAboutBracesException } + nextch } + buf append ch + nextch exit = xCheckEmbeddedBlock ||(ch == '<') || (ch == '&') } val str = buf.toString() diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index 4fad4d7bce..bad78123ca 100755 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -539,7 +539,7 @@ self => leftAssoc && prec == precedence(opstack.head.operator))) { val opinfo = opstack.head opstack = opstack.tail - val opPos = rangePos(opinfo.operand.pos.source, opinfo.offset, opinfo.offset, opinfo.offset+opinfo.operator.length) + val opPos = r2p(opinfo.offset, opinfo.offset, opinfo.offset+opinfo.operator.length) top = atPos(opinfo.operand.pos.startOrPoint, opinfo.offset) { makeBinop(isExpr, opinfo.operand, opinfo.operator, top, opPos) } @@ -1111,6 +1111,11 @@ self => def postfixExpr(): Tree = { val base = opstack var top = prefixExpr() + // Various errors in XML literals can cause xmlLiteral to propagate + // EmptyTree's. Watch out for them here. + if (top == EmptyTree) + return EmptyTree + while (isIdent) { top = reduceStack(true, base, top, precedence(in.name), treeInfo.isLeftAssoc(in.name)) val op = in.name @@ -1118,7 +1123,10 @@ self => ident() newLineOptWhenFollowing(isExprIntroToken) if (isExprIntro) { - top = prefixExpr() + val next = prefixExpr() + if (next == EmptyTree) + return reduceStack(true, base, top, 0, true) + top = next } else { val topinfo = opstack.head opstack = opstack.tail diff --git a/test/files/neg/bug2275a.check b/test/files/neg/bug2275a.check new file mode 100644 index 0000000000..892a903948 --- /dev/null +++ b/test/files/neg/bug2275a.check @@ -0,0 +1,13 @@ +bug2275a.scala:4: error: in XML literal: in XML content, please use '}}' to express '}' + }else{ + ^ +bug2275a.scala:3: error: I encountered a '}' where I didn't expect one, maybe this tag isn't closed <br> + <br> + ^ +bug2275a.scala:4: error: ';' expected but 'else' found. + }else{ + ^ +bug2275a.scala:7: error: '}' expected but eof found. +} + ^ +four errors found diff --git a/test/files/neg/bug2275a.scala b/test/files/neg/bug2275a.scala new file mode 100644 index 0000000000..7f2b803daa --- /dev/null +++ b/test/files/neg/bug2275a.scala @@ -0,0 +1,7 @@ +object Test { + if(true) { + <br> + }else{ + <span>{"louenesee"}</span> + } +} diff --git a/test/files/neg/bug2275b.check b/test/files/neg/bug2275b.check new file mode 100644 index 0000000000..4b61f242d0 --- /dev/null +++ b/test/files/neg/bug2275b.check @@ -0,0 +1,13 @@ +bug2275b.scala:2: error: in XML literal: in XML content, please use '}}' to express '}' + {<br>}xx + ^ +bug2275b.scala:2: error: I encountered a '}' where I didn't expect one, maybe this tag isn't closed <br> + {<br>}xx + ^ +bug2275b.scala:2: error: ';' expected but identifier found. + {<br>}xx + ^ +bug2275b.scala:3: error: '}' expected but eof found. +} + ^ +four errors found diff --git a/test/files/neg/bug2275b.scala b/test/files/neg/bug2275b.scala new file mode 100644 index 0000000000..312cba8d6d --- /dev/null +++ b/test/files/neg/bug2275b.scala @@ -0,0 +1,3 @@ +object Test { + {<br>}xx +} |