From c93aeae09ecca0ae71338f2105c2401dab1ec419 Mon Sep 17 00:00:00 2001 From: Fabian Page Date: Mon, 28 May 2018 21:58:31 +0200 Subject: [PATCH 1/2] fix-#4405 REPL highlight for StringLiteral --- .../dotc/printing/SyntaxHighlighting.scala | 17 ++++++++--------- .../dotc/printing/SyntaxHighlightingTests.scala | 4 ++++ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala b/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala index 9a4635355686..4d886da81b96 100644 --- a/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala +++ b/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala @@ -70,12 +70,12 @@ object SyntaxHighlighting { val n = takeChar() if (interpolationPrefixes.contains(n)) { // Interpolation prefixes are a superset of the keyword start chars - val next = remaining.take(3).mkString - if (next.startsWith("\"")) { - newBuf += n - prev = n - if (remaining.nonEmpty) takeChar() // drop 1 for appendLiteral - appendString('"', next == "\"\"\"") + val (prefix, after) = remaining.span(interpolationPrefixes.contains) + if (after.startsWith("\"")) { + newBuf ++= (n +: prefix) + prev = prefix.lastOption.getOrElse(n) + if (remaining.nonEmpty) takeChars(prefix.length + 1) // drop 1 for appendLiteral + appendString('"', after.startsWith("\"\"\""), true) } else { if (n.isUpper && (keywordStart || prev == '.')) { appendWhile(n, !typeEnders.contains(_), typeDef) @@ -116,7 +116,7 @@ object SyntaxHighlighting { case '@' => appendWhile('@', !typeEnders.contains(_), annotation) case '\"' => - appendString('\"', multiline = remaining.take(2).mkString == "\"\"") + appendString('\"', multiline = remaining.take(2).mkString == "\"\"", false) case '\'' => appendSingleQuote('\'') case '`' => @@ -181,11 +181,10 @@ object SyntaxHighlighting { newBuf append NoColor } - def appendString(delim: Char, multiline: Boolean = false) = { + def appendString(delim: Char, multiline: Boolean = false, inInterpolation: Boolean) = { var curr: Char = 0 var continue = true var closing = 0 - val inInterpolation = interpolationPrefixes.contains(prev) newBuf append (LiteralColor + delim) def shouldInterpolate = diff --git a/compiler/test/dotty/tools/dotc/printing/SyntaxHighlightingTests.scala b/compiler/test/dotty/tools/dotc/printing/SyntaxHighlightingTests.scala index cceaa48cf5b3..2b8d66d84424 100644 --- a/compiler/test/dotty/tools/dotc/printing/SyntaxHighlightingTests.scala +++ b/compiler/test/dotty/tools/dotc/printing/SyntaxHighlightingTests.scala @@ -50,6 +50,10 @@ class SyntaxHighlightingTests { def strings = { // For some reason we currently use literal color for string test("\"Hello\"", "") + test("s\"Hello\"", "s") + test("s\"Hello $name\"", "s") + test("raw\"Hello\"", "raw") + test("raw\"\"\"Hello\"\"\"", "raw") } @Test From f811b7be0d126bc5f808f920313352530ae8a33a Mon Sep 17 00:00:00 2001 From: Fabian Page Date: Mon, 28 May 2018 22:42:40 +0200 Subject: [PATCH 2/2] don't create an intermediate collection --- compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala b/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala index 4d886da81b96..264a2d5d0500 100644 --- a/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala +++ b/compiler/src/dotty/tools/dotc/printing/SyntaxHighlighting.scala @@ -72,7 +72,7 @@ object SyntaxHighlighting { // Interpolation prefixes are a superset of the keyword start chars val (prefix, after) = remaining.span(interpolationPrefixes.contains) if (after.startsWith("\"")) { - newBuf ++= (n +: prefix) + newBuf += n ++= prefix prev = prefix.lastOption.getOrElse(n) if (remaining.nonEmpty) takeChars(prefix.length + 1) // drop 1 for appendLiteral appendString('"', after.startsWith("\"\"\""), true)