summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2010-03-01 11:00:15 +0000
committerMartin Odersky <odersky@gmail.com>2010-03-01 11:00:15 +0000
commit2356f6751e79cb6810858a9026e53098b16a6102 (patch)
tree258596331914aacfc8554f6ffedc86d918819c9f /src/compiler/scala/tools
parent7214dc0e235f363bbc42efac255fc11cc77fdaf4 (diff)
downloadscala-2356f6751e79cb6810858a9026e53098b16a6102.tar.gz
scala-2356f6751e79cb6810858a9026e53098b16a6102.tar.bz2
scala-2356f6751e79cb6810858a9026e53098b16a6102.zip
closed #3101. Review by community.
Diffstat (limited to 'src/compiler/scala/tools')
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Scanners.scala8
-rw-r--r--src/compiler/scala/tools/nsc/util/CharArrayReader.scala24
2 files changed, 24 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
index 841c1709ca..11b53faed5 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
@@ -317,7 +317,7 @@ trait Scanners {
if (ch == '\"') {
nextChar()
if (ch == '\"') {
- nextChar()
+ nextRawChar()
val saved = lineStartOffset
getMultiLineStringLit()
if (lineStartOffset != saved) // ignore linestarts within a multi-line string
@@ -560,9 +560,9 @@ trait Scanners {
private def getMultiLineStringLit() {
if (ch == '\"') {
- nextChar()
+ nextRawChar()
if (ch == '\"') {
- nextChar()
+ nextRawChar()
if (ch == '\"') {
nextChar()
while (ch == '\"') {
@@ -584,7 +584,7 @@ trait Scanners {
incompleteInputError("unclosed multi-line string literal")
} else {
putChar(ch)
- nextChar()
+ nextRawChar()
getMultiLineStringLit()
}
}
diff --git a/src/compiler/scala/tools/nsc/util/CharArrayReader.scala b/src/compiler/scala/tools/nsc/util/CharArrayReader.scala
index 4d04511c1c..39a104fb14 100644
--- a/src/compiler/scala/tools/nsc/util/CharArrayReader.scala
+++ b/src/compiler/scala/tools/nsc/util/CharArrayReader.scala
@@ -35,7 +35,7 @@ abstract class CharArrayReader { self =>
/** Is last character a unicode escape \\uxxxx? */
def isUnicodeEscape = charOffset == lastUnicodeOffset
- /** Advance one character */
+ /** Advance one character; reducing CR;LF pairs to just LF */
final def nextChar() {
if (charOffset >= buf.length) {
ch = SU
@@ -44,8 +44,20 @@ abstract class CharArrayReader { self =>
ch = c
charOffset += 1
if (c == '\\') potentialUnicode()
+ else if (c < ' ') { skipCR(); potentialLineEnd() }
+ }
+ }
+
+ /** Advance one character, leaving CR;LF pairs intact */
+ final def nextRawChar() {
+ if (charOffset >= buf.length) {
+ ch = SU
+ } else {
+ val c = buf(charOffset)
+ ch = c
+ charOffset += 1
+ if (c == '\\') potentialUnicode()
else if (c < ' ') potentialLineEnd()
-// print("`"+ch+"'")
}
}
@@ -71,13 +83,17 @@ abstract class CharArrayReader { self =>
}
}
- /** Handle line ends, replace CR+LF by LF */
- private def potentialLineEnd() {
+ /** replace CR;LF by LF */
+ private def skipCR() {
if (ch == CR)
if (charOffset < buf.length && buf(charOffset) == LF) {
charOffset += 1
ch = LF
}
+ }
+
+ /** Handle line ends */
+ private def potentialLineEnd() {
if (ch == LF || ch == FF) {
lastLineStartOffset = lineStartOffset
lineStartOffset = charOffset