summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiles Sabin <miles@milessabin.com>2009-08-25 17:28:33 +0000
committerMiles Sabin <miles@milessabin.com>2009-08-25 17:28:33 +0000
commit7224d1c26def0519cab9c31c77f02f0ab5734838 (patch)
treeea69bc7b8696ca5dbe16b621367a2b0f1ee58d3d
parentac290525356e1db8408e4c6b2034103805783dec (diff)
downloadscala-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.scala12
-rwxr-xr-xsrc/compiler/scala/tools/nsc/ast/parser/Parsers.scala12
-rw-r--r--test/files/neg/bug2275a.check13
-rw-r--r--test/files/neg/bug2275a.scala7
-rw-r--r--test/files/neg/bug2275b.check13
-rw-r--r--test/files/neg/bug2275b.scala3
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
+}