Skip to content

Commit 563cd73

Browse files
authoredDec 5, 2021
Kotlin: Added char token and improved string interpolation (#3225)
1 parent 6b168a3 commit 563cd73

File tree

6 files changed

+170
-90
lines changed

6 files changed

+170
-90
lines changed
 

‎components/prism-kotlin.js

+45-25
Original file line numberDiff line numberDiff line change
@@ -22,47 +22,67 @@
2222

2323
delete Prism.languages.kotlin['class-name'];
2424

25+
var interpolationInside = {
26+
'interpolation-punctuation': {
27+
pattern: /^\$\{?|\}$/,
28+
alias: 'punctuation'
29+
},
30+
'expression': {
31+
pattern: /[\s\S]+/,
32+
inside: Prism.languages.kotlin
33+
}
34+
};
35+
2536
Prism.languages.insertBefore('kotlin', 'string', {
26-
'raw-string': {
27-
pattern: /("""|''')[\s\S]*?\1/,
28-
alias: 'string'
29-
// See interpolation below
37+
// https://kotlinlang.org/spec/expressions.html#string-interpolation-expressions
38+
'string-literal': [
39+
{
40+
pattern: /"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,
41+
alias: 'multiline',
42+
inside: {
43+
'interpolation': {
44+
pattern: /\$(?:[a-z_]\w*|\{[^{}]*\})/i,
45+
inside: interpolationInside
46+
},
47+
'string': /[\s\S]+/
48+
}
49+
},
50+
{
51+
pattern: /"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,
52+
alias: 'singleline',
53+
inside: {
54+
'interpolation': {
55+
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,
56+
lookbehind: true,
57+
inside: interpolationInside
58+
},
59+
'string': /[\s\S]+/
60+
}
61+
}
62+
],
63+
'char': {
64+
// https://kotlinlang.org/spec/expressions.html#character-literals
65+
pattern: /'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,
66+
greedy: true
3067
}
3168
});
69+
70+
delete Prism.languages.kotlin['string'];
71+
3272
Prism.languages.insertBefore('kotlin', 'keyword', {
3373
'annotation': {
3474
pattern: /\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,
3575
alias: 'builtin'
3676
}
3777
});
78+
3879
Prism.languages.insertBefore('kotlin', 'function', {
3980
'label': {
4081
pattern: /\b\w+@|@\w+\b/,
4182
alias: 'symbol'
4283
}
4384
});
4485

45-
var interpolation = [
46-
{
47-
pattern: /\$\{[^}]+\}/,
48-
inside: {
49-
'delimiter': {
50-
pattern: /^\$\{|\}$/,
51-
alias: 'variable'
52-
},
53-
rest: Prism.languages.kotlin
54-
}
55-
},
56-
{
57-
pattern: /\$\w+/,
58-
alias: 'variable'
59-
}
60-
];
61-
62-
Prism.languages.kotlin['string'].inside = Prism.languages.kotlin['raw-string'].inside = {
63-
interpolation: interpolation
64-
};
65-
6686
Prism.languages.kt = Prism.languages.kotlin;
6787
Prism.languages.kts = Prism.languages.kotlin;
6888
}(Prism));

‎components/prism-kotlin.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
'a'
2+
'\n'
3+
'\uFFFF'
4+
5+
----------------------------------------------------
6+
7+
[
8+
["char", "'a'"],
9+
["char", "'\\n'"],
10+
["char", "'\\uFFFF'"]
11+
]

‎tests/languages/kotlin/interpolation_feature.test

-46
This file was deleted.

‎tests/languages/kotlin/raw-string_feature.test

-18
This file was deleted.
+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
""
2+
"foo"
3+
"\"\""
4+
5+
""""""
6+
"""Foo "bar"" baz"""
7+
"""
8+
"Foo"
9+
bar
10+
"""
11+
12+
// interpolation
13+
14+
"$foo ${bar} ${'$'} ${foobar()}"
15+
"""
16+
$foo ${bar}
17+
${'$'} ${foobar()}
18+
"""
19+
20+
----------------------------------------------------
21+
22+
[
23+
["string-literal", [
24+
["string", "\"\""]
25+
]],
26+
["string-literal", [
27+
["string", "\"foo\""]
28+
]],
29+
["string-literal", [
30+
["string", "\"\\\"\\\"\""]
31+
]],
32+
33+
["string-literal", [
34+
["string", "\"\"\"\"\"\""]
35+
]],
36+
["string-literal", [
37+
["string", "\"\"\"Foo \"bar\"\" baz\"\"\""]
38+
]],
39+
["string-literal", [
40+
["string", "\"\"\"\r\n\"Foo\"\r\nbar\r\n\"\"\""]
41+
]],
42+
43+
["comment", "// interpolation"],
44+
45+
["string-literal", [
46+
["string", "\""],
47+
["interpolation", [
48+
["interpolation-punctuation", "$"],
49+
["expression", ["foo"]]
50+
]],
51+
["string", " "],
52+
["interpolation", [
53+
["interpolation-punctuation", "${"],
54+
["expression", ["bar"]],
55+
["interpolation-punctuation", "}"]
56+
]],
57+
["string", " "],
58+
["interpolation", [
59+
["interpolation-punctuation", "${"],
60+
["expression", [
61+
["char", "'$'"]
62+
]],
63+
["interpolation-punctuation", "}"]
64+
]],
65+
["string", " "],
66+
["interpolation", [
67+
["interpolation-punctuation", "${"],
68+
["expression", [
69+
["function", "foobar"],
70+
["punctuation", "("],
71+
["punctuation", ")"]
72+
]],
73+
["interpolation-punctuation", "}"]
74+
]],
75+
["string", "\""]
76+
]],
77+
["string-literal", [
78+
["string", "\"\"\"\r\n"],
79+
["interpolation", [
80+
["interpolation-punctuation", "$"],
81+
["expression", ["foo"]]
82+
]],
83+
["string", " "],
84+
["interpolation", [
85+
["interpolation-punctuation", "${"],
86+
["expression", ["bar"]],
87+
["interpolation-punctuation", "}"]
88+
]],
89+
["string", "\r\n"],
90+
["interpolation", [
91+
["interpolation-punctuation", "${"],
92+
["expression", [
93+
["char", "'$'"]
94+
]],
95+
["interpolation-punctuation", "}"]
96+
]],
97+
["string", " "],
98+
["interpolation", [
99+
["interpolation-punctuation", "${"],
100+
["expression", [
101+
["function", "foobar"],
102+
["punctuation", "("],
103+
["punctuation", ")"]
104+
]],
105+
["interpolation-punctuation", "}"]
106+
]],
107+
["string", "\r\n\"\"\""]
108+
]]
109+
]
110+
111+
----------------------------------------------------
112+
113+
Checks for raw strings.

0 commit comments

Comments
 (0)
Please sign in to comment.