diff options
author | Martin Odersky <odersky@gmail.com> | 2010-03-01 11:00:15 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2010-03-01 11:00:15 +0000 |
commit | 2356f6751e79cb6810858a9026e53098b16a6102 (patch) | |
tree | 258596331914aacfc8554f6ffedc86d918819c9f /src | |
parent | 7214dc0e235f363bbc42efac255fc11cc77fdaf4 (diff) | |
download | scala-2356f6751e79cb6810858a9026e53098b16a6102.tar.gz scala-2356f6751e79cb6810858a9026e53098b16a6102.tar.bz2 scala-2356f6751e79cb6810858a9026e53098b16a6102.zip |
closed #3101. Review by community.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/Scanners.scala | 8 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/util/CharArrayReader.scala | 24 |
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 |