diff options
author | Som Snytt <som.snytt@gmail.com> | 2017-01-07 01:30:38 -0800 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2017-01-08 01:07:22 -0800 |
commit | 939abf1c7062f8be4f84854bb44a8e146d14a07f (patch) | |
tree | c8c1c917462c545626cfe1430677115f7a7c347a /src/compiler/scala/tools/nsc/ast/parser/Scanners.scala | |
parent | 855492c928a795f175c6bb10ee6d4b23c871a123 (diff) | |
download | scala-939abf1c7062f8be4f84854bb44a8e146d14a07f.tar.gz scala-939abf1c7062f8be4f84854bb44a8e146d14a07f.tar.bz2 scala-939abf1c7062f8be4f84854bb44a8e146d14a07f.zip |
SI-10120 Extra advice on unclosed char literal
Folks from other languages might mistakenly enclose
a string in single quotes. Since this presents as
a symbol literal followed by the unpaired single
quote, we can add a syntax reminder.
Also polish the wording for bad string
interpolation.
Diffstat (limited to 'src/compiler/scala/tools/nsc/ast/parser/Scanners.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/Scanners.scala | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala index 54c604c072..2075901d31 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala @@ -532,6 +532,15 @@ trait Scanners extends ScannersCommon { } fetchDoubleQuote() case '\'' => + def unclosedCharLit() = { + val msg = "unclosed character literal" + // previous token was Symbol contiguous with the orphan single quote at offset + if (token == SYMBOLLIT && offset == lastOffset) { + syntaxError(s"""$msg (or use " for string literal "$strVal")""") + } else { + syntaxError(msg) + } + } def fetchSingleQuote() = { nextChar() if (isIdentifierStart(ch)) @@ -545,16 +554,14 @@ trait Scanners extends ScannersCommon { } else if (!isAtEnd && (ch != SU && ch != CR && ch != LF || isUnicodeEscape)) { getLitChar() - if (ch == '\'') { + if (ch != '\'') unclosedCharLit() + else { nextChar() token = CHARLIT setStrVal() - } else { - syntaxError("unclosed character literal") } } - else - syntaxError("unclosed character literal") + else unclosedCharLit() } fetchSingleQuote() case '.' => @@ -786,7 +793,7 @@ trait Scanners extends ScannersCommon { next.token = kwArray(idx) } } else { - syntaxError("invalid string interpolation: `$$', `$'ident or `$'BlockExpr expected") + syntaxError(s"invalid string interpolation $$$ch, expected: $$$$, $$identifier or $${expression}") } } else { val isUnclosedLiteral = !isUnicodeEscape && (ch == SU || (!multiLine && (ch == CR || ch == LF))) |