From e72b4c95debc2c38e509a7e9ee360de69245e8dd Mon Sep 17 00:00:00 2001
From: Nicolas Stucki <nicolas.stucki@gmail.com>
Date: Fri, 5 Feb 2021 15:47:57 +0100
Subject: [PATCH] Improve highlighting strategy for illegal $

Also fix missing rules for `"""` and `raw`
---
 src/typescript/Scala.tmLanguage.ts | 28 ++++++++++++-----
 tests/unit/#183.test.scala         |  2 +-
 tests/unit/#195.test.scala         | 49 +++++++++++++++++++++++++-----
 3 files changed, 63 insertions(+), 16 deletions(-)

diff --git a/src/typescript/Scala.tmLanguage.ts b/src/typescript/Scala.tmLanguage.ts
index c22b96c..7300246 100644
--- a/src/typescript/Scala.tmLanguage.ts
+++ b/src/typescript/Scala.tmLanguage.ts
@@ -333,7 +333,7 @@ export const scalaTmLanguage: TmLanguage = {
         },
         {
           begin: `\\b(raw)(""")`,
-          end: '"""(?!")',
+          end: `(""")(?!")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
           beginCaptures: {
             '1': {
               name: 'keyword.interpolation.scala'
@@ -356,14 +356,17 @@ export const scalaTmLanguage: TmLanguage = {
             }
           ],
           endCaptures: {
-            '0': {
+            '1': {
               name: 'string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala'
+            },
+            '2': {
+              name: 'invalid.illegal.unrecognized-string-escape.scala'
             }
           }
         },
         {
           begin: `\\b(${alphaId})(""")`,
-          end: '"""(?!")',
+          end: `(""")(?!")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
           beginCaptures: {
             '1': {
               name: 'keyword.interpolation.scala'
@@ -386,8 +389,11 @@ export const scalaTmLanguage: TmLanguage = {
             }
           ],
           endCaptures: {
-            '0': {
+            '1': {
               name: 'string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala'
+            },
+            '2': {
+              name: 'invalid.illegal.unrecognized-string-escape.scala'
             }
           }
         },
@@ -418,7 +424,7 @@ export const scalaTmLanguage: TmLanguage = {
         },
         {
           begin: `\\b(raw)(")`,
-          end: `"|\\$(?=[^\\$"_{${letterChars}])`,
+          end: `(")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
           beginCaptures: {
             '1': {
               name: 'keyword.interpolation.scala'
@@ -441,14 +447,17 @@ export const scalaTmLanguage: TmLanguage = {
             }
           ],
           endCaptures: {
-            '0': {
+            '1': {
               name: 'string.quoted.double.interpolated.scala punctuation.definition.string.end.scala'
+            },
+            '2': {
+              name: 'invalid.illegal.unrecognized-string-escape.scala'
             }
           }
         },
         {
           begin: `\\b(${alphaId})(")`,
-          end: `"|\\$(?=[^\\$"_{${letterChars}])`,
+          end: `(")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
           beginCaptures: {
             '1': {
               name: 'keyword.interpolation.scala'
@@ -479,8 +488,11 @@ export const scalaTmLanguage: TmLanguage = {
             }
           ],
           endCaptures: {
-            '0': {
+            '1': {
               name: 'string.quoted.double.interpolated.scala punctuation.definition.string.end.scala'
+            },
+            '2': {
+              name: 'invalid.illegal.unrecognized-string-escape.scala'
             }
           }
         }
diff --git a/tests/unit/#183.test.scala b/tests/unit/#183.test.scala
index 2952e57..9592cc8 100644
--- a/tests/unit/#183.test.scala
+++ b/tests/unit/#183.test.scala
@@ -78,4 +78,4 @@
     raw"$
 //  ^^^ source.scala keyword.interpolation.scala
 //     ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
-//      ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
+//      ^ - string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
diff --git a/tests/unit/#195.test.scala b/tests/unit/#195.test.scala
index 56d302f..b8200c0 100644
--- a/tests/unit/#195.test.scala
+++ b/tests/unit/#195.test.scala
@@ -30,18 +30,53 @@
 //     ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
 
 
+   s"$
+//  ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
+//   ^ - string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
+//   ^ - constant.character.escape.scala
+
+
    s"$ //
 //  ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
-//   ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
-//     ^^ comment.line.double-slash.scala punctuation.definition.comment.scala
+//   ^^ invalid.illegal.unrecognized-string-escape.scala
 
-   s"$+
+   s"$++
 //  ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
-//   ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
-//    ^ keyword.operator.arithmetic.scala
+//   ^^ invalid.illegal.unrecognized-string-escape.scala
+//     ^ keyword.operator.arithmetic.scala
 
    s"$; val a =
 //  ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
-//   ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
-//    ^^^^^^^^^^ -string.quoted.double.interpolated.scala
+//   ^^ invalid.illegal.unrecognized-string-escape.scala
+//      ^^^^^^^^ -string.quoted.double.interpolated.scala
 //      ^^^ keyword.declaration.stable.scala
+
+    raw"$
+//  ^^^ source.scala keyword.interpolation.scala
+//     ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
+//      ^ - string.quoted.double.interpolated.scala invalid.illegal.unrecognized-string-escape.scala
+
+    raw"$4
+//  ^^^ source.scala keyword.interpolation.scala
+//     ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
+//      ^^ invalid.illegal.unrecognized-string-escape.scala
+
+    raw"""$
+//  ^^^ source.scala keyword.interpolation.scala
+//     ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
+//        ^ - string.quoted.triple.interpolated.scala invalid.illegal.unrecognized-string-escape.scala
+
+    raw"""$8
+//  ^^^ source.scala keyword.interpolation.scala
+//     ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
+//        ^^ invalid.illegal.unrecognized-string-escape.scala
+
+    s"""$
+//  ^ source.scala keyword.interpolation.scala
+//   ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
+//      ^ - string.quoted.triple.interpolated.scala invalid.illegal.unrecognized-string-escape.scala
+
+    s"""$8
+//  ^ source.scala keyword.interpolation.scala
+//   ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
+//      ^^ invalid.illegal.unrecognized-string-escape.scala