Skip to content

Commit 6d3de7b

Browse files
committed
Identify illegal $ tokens in string interpolators
Fixes #195 Scala 2 stops parsing after one of these failures. It does not matter how we highlight the rest. Scala 3 continues parsing assuming the string has been closed. Highlighting the following code as if the string was closed helps to understand the following parsing errors.
1 parent 8dee609 commit 6d3de7b

File tree

3 files changed

+67
-5
lines changed

3 files changed

+67
-5
lines changed

src/typescript/Scala.tmLanguage.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ export const scalaTmLanguage: TmLanguage = {
418418
},
419419
{
420420
begin: `\\b(raw)(")`,
421-
end: '"',
421+
end: `(")|(\\$(?=[^\\$"_{${letterChars}]))`,
422422
beginCaptures: {
423423
'1': {
424424
name: 'keyword.interpolation.scala'
@@ -441,14 +441,17 @@ export const scalaTmLanguage: TmLanguage = {
441441
}
442442
],
443443
endCaptures: {
444-
'0': {
444+
'1': {
445445
name: 'string.quoted.double.interpolated.scala punctuation.definition.string.end.scala'
446+
},
447+
'2': {
448+
name: 'invalid.illegal.unrecognized-string-escape.scala'
446449
}
447450
}
448451
},
449452
{
450453
begin: `\\b(${alphaId})(")`,
451-
end: '"',
454+
end: `(")|(\\$(?=[^\\$"_{${letterChars}]))`,
452455
beginCaptures: {
453456
'1': {
454457
name: 'keyword.interpolation.scala'
@@ -458,6 +461,10 @@ export const scalaTmLanguage: TmLanguage = {
458461
}
459462
},
460463
patterns: [
464+
{
465+
match: "\\$[\\$\"]",
466+
name: 'constant.character.escape.scala'
467+
},
461468
{
462469
include: "#string-interpolation"
463470
},
@@ -475,8 +482,11 @@ export const scalaTmLanguage: TmLanguage = {
475482
}
476483
],
477484
endCaptures: {
478-
'0': {
485+
'1': {
479486
name: 'string.quoted.double.interpolated.scala punctuation.definition.string.end.scala'
487+
},
488+
'2': {
489+
name: 'invalid.illegal.unrecognized-string-escape.scala'
480490
}
481491
}
482492
}

tests/unit/#183.test.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// ^^ string.quoted.double.interpolated.scala
1414
// ^^ - constant.character.escape.scala
1515
// ^ punctuation.definition.string.end.scala
16-
16+
1717
raw"$$ " // `$$` is an escaped `$` in raw interpolators
1818
// ^^^ source.scala keyword.interpolation.scala
1919
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
@@ -74,3 +74,8 @@
7474
// ^ meta.template.expression.scala punctuation.definition.template-expression.end.scala
7575
// ^ string.quoted.triple.interpolated.scala
7676
// ^^^ punctuation.definition.string.end.scala
77+
78+
raw"$
79+
// ^^^ source.scala keyword.interpolation.scala
80+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
81+
// ^ invalid.illegal.unrecognized-string-escape.scala

tests/unit/#195.test.scala

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// SYNTAX TEST "source.scala"
2+
3+
s"$a"
4+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
5+
// ^ meta.template.expression.scala punctuation.definition.template-expression.begin.scala
6+
// ^ meta.template.expression.scala
7+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
8+
9+
s"${a}"
10+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
11+
// ^^ meta.template.expression.scala punctuation.definition.template-expression.begin.scala
12+
// ^ meta.template.expression.scala
13+
// ^ meta.template.expression.scala punctuation.definition.template-expression.end.scala
14+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
15+
16+
s"$_"
17+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
18+
// ^ source.scala meta.template.expression.scala punctuation.definition.template-expression.begin.scala
19+
// ^ source.scala meta.template.expression.scala
20+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
21+
22+
s"$$"
23+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
24+
// ^^ constant.character.escape.scala
25+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
26+
27+
s"$""
28+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
29+
// ^^ constant.character.escape.scala
30+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
31+
32+
33+
s"$ //
34+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
35+
// ^ invalid.illegal.unrecognized-string-escape.scala
36+
// ^^ comment.line.double-slash.scala punctuation.definition.comment.scala
37+
38+
s"$+
39+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
40+
// ^ invalid.illegal.unrecognized-string-escape.scala
41+
// ^ keyword.operator.arithmetic.scala
42+
43+
s"$; val a =
44+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
45+
// ^ invalid.illegal.unrecognized-string-escape.scala
46+
// ^^^^^^^^^^ -string.quoted.double.interpolated.scala
47+
// ^^^ keyword.declaration.stable.scala

0 commit comments

Comments
 (0)