Skip to content

Commit fb98da1

Browse files
authored
Merge pull request #196 from nicolasstucki/fix-#195
Identify illegal $ tokens in string interpolators
2 parents 8dee609 + e72b4c9 commit fb98da1

File tree

3 files changed

+112
-9
lines changed

3 files changed

+112
-9
lines changed

src/typescript/Scala.tmLanguage.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ export const scalaTmLanguage: TmLanguage = {
333333
},
334334
{
335335
begin: `\\b(raw)(""")`,
336-
end: '"""(?!")',
336+
end: `(""")(?!")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
337337
beginCaptures: {
338338
'1': {
339339
name: 'keyword.interpolation.scala'
@@ -356,14 +356,17 @@ export const scalaTmLanguage: TmLanguage = {
356356
}
357357
],
358358
endCaptures: {
359-
'0': {
359+
'1': {
360360
name: 'string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala'
361+
},
362+
'2': {
363+
name: 'invalid.illegal.unrecognized-string-escape.scala'
361364
}
362365
}
363366
},
364367
{
365368
begin: `\\b(${alphaId})(""")`,
366-
end: '"""(?!")',
369+
end: `(""")(?!")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
367370
beginCaptures: {
368371
'1': {
369372
name: 'keyword.interpolation.scala'
@@ -386,8 +389,11 @@ export const scalaTmLanguage: TmLanguage = {
386389
}
387390
],
388391
endCaptures: {
389-
'0': {
392+
'1': {
390393
name: 'string.quoted.triple.interpolated.scala punctuation.definition.string.end.scala'
394+
},
395+
'2': {
396+
name: 'invalid.illegal.unrecognized-string-escape.scala'
391397
}
392398
}
393399
},
@@ -418,7 +424,7 @@ export const scalaTmLanguage: TmLanguage = {
418424
},
419425
{
420426
begin: `\\b(raw)(")`,
421-
end: '"',
427+
end: `(")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
422428
beginCaptures: {
423429
'1': {
424430
name: 'keyword.interpolation.scala'
@@ -441,14 +447,17 @@ export const scalaTmLanguage: TmLanguage = {
441447
}
442448
],
443449
endCaptures: {
444-
'0': {
450+
'1': {
445451
name: 'string.quoted.double.interpolated.scala punctuation.definition.string.end.scala'
452+
},
453+
'2': {
454+
name: 'invalid.illegal.unrecognized-string-escape.scala'
446455
}
447456
}
448457
},
449458
{
450459
begin: `\\b(${alphaId})(")`,
451-
end: '"',
460+
end: `(")|\\$\n|(\\$[^\\$"_{${letterChars}])`,
452461
beginCaptures: {
453462
'1': {
454463
name: 'keyword.interpolation.scala'
@@ -458,6 +467,10 @@ export const scalaTmLanguage: TmLanguage = {
458467
}
459468
},
460469
patterns: [
470+
{
471+
match: "\\$[\\$\"]",
472+
name: 'constant.character.escape.scala'
473+
},
461474
{
462475
include: "#string-interpolation"
463476
},
@@ -475,8 +488,11 @@ export const scalaTmLanguage: TmLanguage = {
475488
}
476489
],
477490
endCaptures: {
478-
'0': {
491+
'1': {
479492
name: 'string.quoted.double.interpolated.scala punctuation.definition.string.end.scala'
493+
},
494+
'2': {
495+
name: 'invalid.illegal.unrecognized-string-escape.scala'
480496
}
481497
}
482498
}

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+
// ^ - string.quoted.double.interpolated.scala punctuation.definition.string.end.scala

tests/unit/#195.test.scala

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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+
// ^ - string.quoted.double.interpolated.scala punctuation.definition.string.end.scala
36+
// ^ - constant.character.escape.scala
37+
38+
39+
s"$ //
40+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
41+
// ^^ invalid.illegal.unrecognized-string-escape.scala
42+
43+
s"$++
44+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
45+
// ^^ invalid.illegal.unrecognized-string-escape.scala
46+
// ^ keyword.operator.arithmetic.scala
47+
48+
s"$; val a =
49+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
50+
// ^^ invalid.illegal.unrecognized-string-escape.scala
51+
// ^^^^^^^^ -string.quoted.double.interpolated.scala
52+
// ^^^ keyword.declaration.stable.scala
53+
54+
raw"$
55+
// ^^^ source.scala keyword.interpolation.scala
56+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
57+
// ^ - string.quoted.double.interpolated.scala invalid.illegal.unrecognized-string-escape.scala
58+
59+
raw"$4
60+
// ^^^ source.scala keyword.interpolation.scala
61+
// ^ string.quoted.double.interpolated.scala punctuation.definition.string.begin.scala
62+
// ^^ invalid.illegal.unrecognized-string-escape.scala
63+
64+
raw"""$
65+
// ^^^ source.scala keyword.interpolation.scala
66+
// ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
67+
// ^ - string.quoted.triple.interpolated.scala invalid.illegal.unrecognized-string-escape.scala
68+
69+
raw"""$8
70+
// ^^^ source.scala keyword.interpolation.scala
71+
// ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
72+
// ^^ invalid.illegal.unrecognized-string-escape.scala
73+
74+
s"""$
75+
// ^ source.scala keyword.interpolation.scala
76+
// ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
77+
// ^ - string.quoted.triple.interpolated.scala invalid.illegal.unrecognized-string-escape.scala
78+
79+
s"""$8
80+
// ^ source.scala keyword.interpolation.scala
81+
// ^^^ string.quoted.triple.interpolated.scala punctuation.definition.string.begin.scala
82+
// ^^ invalid.illegal.unrecognized-string-escape.scala

0 commit comments

Comments
 (0)