diff --git a/src/typescript/Scala.tmLanguage.ts b/src/typescript/Scala.tmLanguage.ts index 6796fd1..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: '"', + 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: '"', + end: `(")|\\$\n|(\\$[^\\$"_{${letterChars}])`, beginCaptures: { '1': { name: 'keyword.interpolation.scala' @@ -458,6 +467,10 @@ export const scalaTmLanguage: TmLanguage = { } }, patterns: [ + { + match: "\\$[\\$\"]", + name: 'constant.character.escape.scala' + }, { include: "#string-interpolation" }, @@ -475,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 faa0a91..9592cc8 100644 --- a/tests/unit/#183.test.scala +++ b/tests/unit/#183.test.scala @@ -13,7 +13,7 @@ // ^^ string.quoted.double.interpolated.scala // ^^ - constant.character.escape.scala // ^ punctuation.definition.string.end.scala - + raw"$$ " // `$$` is an escaped `$` in raw interpolators // ^^^ source.scala keyword.interpolation.scala // ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala @@ -74,3 +74,8 @@ // ^ meta.template.expression.scala punctuation.definition.template-expression.end.scala // ^ string.quoted.triple.interpolated.scala // ^^^ punctuation.definition.string.end.scala + + 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 diff --git a/tests/unit/#195.test.scala b/tests/unit/#195.test.scala new file mode 100644 index 0000000..b8200c0 --- /dev/null +++ b/tests/unit/#195.test.scala @@ -0,0 +1,82 @@ +// SYNTAX TEST "source.scala" + + s"$a" +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala +// ^ meta.template.expression.scala punctuation.definition.template-expression.begin.scala +// ^ meta.template.expression.scala +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala + + s"${a}" +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala +// ^^ meta.template.expression.scala punctuation.definition.template-expression.begin.scala +// ^ meta.template.expression.scala +// ^ meta.template.expression.scala punctuation.definition.template-expression.end.scala +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala + + s"$_" +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala +// ^ source.scala meta.template.expression.scala punctuation.definition.template-expression.begin.scala +// ^ source.scala meta.template.expression.scala +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala + + s"$$" +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala +// ^^ constant.character.escape.scala +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala + + s"$"" +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala +// ^^ constant.character.escape.scala +// ^ 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 +// ^^ invalid.illegal.unrecognized-string-escape.scala + + s"$++ +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala +// ^^ invalid.illegal.unrecognized-string-escape.scala +// ^ keyword.operator.arithmetic.scala + + s"$; val a = +// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.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