Skip to content

Commit

Permalink
Kotlin: Added char token and improved string interpolation (#3225)
Browse files Browse the repository at this point in the history
  • Loading branch information
RunDevelopment committed Dec 5, 2021
1 parent 6b168a3 commit 563cd73
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 90 deletions.
70 changes: 45 additions & 25 deletions components/prism-kotlin.js
Expand Up @@ -22,47 +22,67 @@

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

var interpolationInside = {
'interpolation-punctuation': {
pattern: /^\$\{?|\}$/,
alias: 'punctuation'
},
'expression': {
pattern: /[\s\S]+/,
inside: Prism.languages.kotlin
}
};

Prism.languages.insertBefore('kotlin', 'string', {
'raw-string': {
pattern: /("""|''')[\s\S]*?\1/,
alias: 'string'
// See interpolation below
// https://kotlinlang.org/spec/expressions.html#string-interpolation-expressions
'string-literal': [
{
pattern: /"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,
alias: 'multiline',
inside: {
'interpolation': {
pattern: /\$(?:[a-z_]\w*|\{[^{}]*\})/i,
inside: interpolationInside
},
'string': /[\s\S]+/
}
},
{
pattern: /"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,
alias: 'singleline',
inside: {
'interpolation': {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,
lookbehind: true,
inside: interpolationInside
},
'string': /[\s\S]+/
}
}
],
'char': {
// https://kotlinlang.org/spec/expressions.html#character-literals
pattern: /'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,
greedy: true
}
});

delete Prism.languages.kotlin['string'];

Prism.languages.insertBefore('kotlin', 'keyword', {
'annotation': {
pattern: /\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,
alias: 'builtin'
}
});

Prism.languages.insertBefore('kotlin', 'function', {
'label': {
pattern: /\b\w+@|@\w+\b/,
alias: 'symbol'
}
});

var interpolation = [
{
pattern: /\$\{[^}]+\}/,
inside: {
'delimiter': {
pattern: /^\$\{|\}$/,
alias: 'variable'
},
rest: Prism.languages.kotlin
}
},
{
pattern: /\$\w+/,
alias: 'variable'
}
];

Prism.languages.kotlin['string'].inside = Prism.languages.kotlin['raw-string'].inside = {
interpolation: interpolation
};

Prism.languages.kt = Prism.languages.kotlin;
Prism.languages.kts = Prism.languages.kotlin;
}(Prism));
2 changes: 1 addition & 1 deletion components/prism-kotlin.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions tests/languages/kotlin/char_feature.test
@@ -0,0 +1,11 @@
'a'
'\n'
'\uFFFF'

----------------------------------------------------

[
["char", "'a'"],
["char", "'\\n'"],
["char", "'\\uFFFF'"]
]
46 changes: 0 additions & 46 deletions tests/languages/kotlin/interpolation_feature.test

This file was deleted.

18 changes: 0 additions & 18 deletions tests/languages/kotlin/raw-string_feature.test

This file was deleted.

113 changes: 113 additions & 0 deletions tests/languages/kotlin/string_feature.test
@@ -0,0 +1,113 @@
""
"foo"
"\"\""

""""""
"""Foo "bar"" baz"""
"""
"Foo"
bar
"""

// interpolation

"$foo ${bar} ${'$'} ${foobar()}"
"""
$foo ${bar}
${'$'} ${foobar()}
"""

----------------------------------------------------

[
["string-literal", [
["string", "\"\""]
]],
["string-literal", [
["string", "\"foo\""]
]],
["string-literal", [
["string", "\"\\\"\\\"\""]
]],

["string-literal", [
["string", "\"\"\"\"\"\""]
]],
["string-literal", [
["string", "\"\"\"Foo \"bar\"\" baz\"\"\""]
]],
["string-literal", [
["string", "\"\"\"\r\n\"Foo\"\r\nbar\r\n\"\"\""]
]],

["comment", "// interpolation"],

["string-literal", [
["string", "\""],
["interpolation", [
["interpolation-punctuation", "$"],
["expression", ["foo"]]
]],
["string", " "],
["interpolation", [
["interpolation-punctuation", "${"],
["expression", ["bar"]],
["interpolation-punctuation", "}"]
]],
["string", " "],
["interpolation", [
["interpolation-punctuation", "${"],
["expression", [
["char", "'$'"]
]],
["interpolation-punctuation", "}"]
]],
["string", " "],
["interpolation", [
["interpolation-punctuation", "${"],
["expression", [
["function", "foobar"],
["punctuation", "("],
["punctuation", ")"]
]],
["interpolation-punctuation", "}"]
]],
["string", "\""]
]],
["string-literal", [
["string", "\"\"\"\r\n"],
["interpolation", [
["interpolation-punctuation", "$"],
["expression", ["foo"]]
]],
["string", " "],
["interpolation", [
["interpolation-punctuation", "${"],
["expression", ["bar"]],
["interpolation-punctuation", "}"]
]],
["string", "\r\n"],
["interpolation", [
["interpolation-punctuation", "${"],
["expression", [
["char", "'$'"]
]],
["interpolation-punctuation", "}"]
]],
["string", " "],
["interpolation", [
["interpolation-punctuation", "${"],
["expression", [
["function", "foobar"],
["punctuation", "("],
["punctuation", ")"]
]],
["interpolation-punctuation", "}"]
]],
["string", "\r\n\"\"\""]
]]
]

----------------------------------------------------

Checks for raw strings.

0 comments on commit 563cd73

Please sign in to comment.