Add keywords of Kotlin and modify it's number pattern. (#1389) * Add keywords & modify number pattern. - Missing keywords by the creator: vararg dynamic infix operator; - New keywords by Kotlin 1.1&1.2: suspend typealias external expect actual; - Remove keyword 'to' as it just a common function name; - Add seperator '_' for the number iteral; - Prefix of hexadecimal and binary can also be capital. * Fix the wrong format of test file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
diff --git a/components/prism-kotlin.js b/components/prism-kotlin.js
index 0189cfe..2da2ce6 100644
--- a/components/prism-kotlin.js
+++ b/components/prism-kotlin.js
@@ -2,7 +2,7 @@
Prism.languages.kotlin = Prism.languages.extend('clike', {
'keyword': {
// The lookbehind prevents wrong highlighting of e.g. kotlin.properties.get
- pattern: /(^|[^.])\b(?:abstract|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|else|enum|final|finally|for|fun|get|if|import|in|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|out|override|package|private|protected|public|reified|return|sealed|set|super|tailrec|this|throw|to|try|val|var|when|where|while)\b/,
+ pattern: /(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|try|typealias|val|var|vararg|when|where|while)\b/,
lookbehind: true
},
'function': [
@@ -12,7 +12,7 @@
lookbehind: true
}
],
- 'number': /\b(?:0[bx][\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?[fFL]?)\b/,
+ 'number': /\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,
'operator': /\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/
});
diff --git a/components/prism-kotlin.min.js b/components/prism-kotlin.min.js
index 7880535..b19ca1c 100644
--- a/components/prism-kotlin.min.js
+++ b/components/prism-kotlin.min.js
@@ -1 +1 @@
-!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|else|enum|final|finally|for|fun|get|if|import|in|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|out|override|package|private|protected|public|reified|return|sealed|set|super|tailrec|this|throw|to|try|val|var|when|where|while)\b/,lookbehind:!0},"function":[/\w+(?=\s*\()/,{pattern:/(\.)\w+(?=\s*\{)/,lookbehind:!0}],number:/\b(?:0[bx][\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"],n.languages.insertBefore("kotlin","string",{"raw-string":{pattern:/("""|''')[\s\S]*?\1/,alias:"string"}}),n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\w+@|@\w+/,alias:"symbol"}});var e=[{pattern:/\$\{[^}]+\}/,inside:{delimiter:{pattern:/^\$\{|\}$/,alias:"variable"},rest:n.languages.kotlin}},{pattern:/\$\w+/,alias:"variable"}];n.languages.kotlin.string.inside=n.languages.kotlin["raw-string"].inside={interpolation:e}}(Prism);
\ No newline at end of file
+!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},"function":[/\w+(?=\s*\()/,{pattern:/(\.)\w+(?=\s*\{)/,lookbehind:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"],e.languages.insertBefore("kotlin","string",{"raw-string":{pattern:/("""|''')[\s\S]*?\1/,alias:"string"}}),e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\w+@|@\w+/,alias:"symbol"}});var n=[{pattern:/\$\{[^}]+\}/,inside:{delimiter:{pattern:/^\$\{|\}$/,alias:"variable"},rest:e.languages.kotlin}},{pattern:/\$\w+/,alias:"variable"}];e.languages.kotlin.string.inside=e.languages.kotlin["raw-string"].inside={interpolation:n}}(Prism);
\ No newline at end of file
diff --git a/tests/languages/kotlin/keyword_feature.test b/tests/languages/kotlin/keyword_feature.test
index d8ace30..bd139c4 100644
--- a/tests/languages/kotlin/keyword_feature.test
+++ b/tests/languages/kotlin/keyword_feature.test
@@ -1,4 +1,5 @@
abstract
+actual
annotation
as
break
@@ -12,8 +13,11 @@ continue
crossinline
data
do
+dynamic
else
enum
+expect
+external
final
finally
for
@@ -22,6 +26,7 @@ get
if
import
in
+infix
init
inline
inner
@@ -33,6 +38,7 @@ noinline
null
object
open
+operator
out
override
package
@@ -44,13 +50,15 @@ return
sealed
set
super
+suspend
tailrec
this
throw
-to
try
+typealias
val
var
+vararg
when
where
while
@@ -59,6 +67,7 @@ while
[
["keyword", "abstract"],
+ ["keyword", "actual"],
["keyword", "annotation"],
["keyword", "as"],
["keyword", "break"],
@@ -72,8 +81,11 @@ while
["keyword", "crossinline"],
["keyword", "data"],
["keyword", "do"],
+ ["keyword", "dynamic"],
["keyword", "else"],
["keyword", "enum"],
+ ["keyword", "expect"],
+ ["keyword", "external"],
["keyword", "final"],
["keyword", "finally"],
["keyword", "for"],
@@ -82,6 +94,7 @@ while
["keyword", "if"],
["keyword", "import"],
["keyword", "in"],
+ ["keyword", "infix"],
["keyword", "init"],
["keyword", "inline"],
["keyword", "inner"],
@@ -93,6 +106,7 @@ while
["keyword", "null"],
["keyword", "object"],
["keyword", "open"],
+ ["keyword", "operator"],
["keyword", "out"],
["keyword", "override"],
["keyword", "package"],
@@ -104,13 +118,15 @@ while
["keyword", "sealed"],
["keyword", "set"],
["keyword", "super"],
+ ["keyword", "suspend"],
["keyword", "tailrec"],
["keyword", "this"],
["keyword", "throw"],
- ["keyword", "to"],
["keyword", "try"],
+ ["keyword", "typealias"],
["keyword", "val"],
["keyword", "var"],
+ ["keyword", "vararg"],
["keyword", "when"],
["keyword", "where"],
["keyword", "while"]
diff --git a/tests/languages/kotlin/number_feature.test b/tests/languages/kotlin/number_feature.test
index df21736..f10b944 100644
--- a/tests/languages/kotlin/number_feature.test
+++ b/tests/languages/kotlin/number_feature.test
@@ -8,6 +8,11 @@
123.5e+10
123.5f
123.5F
+123_456
+123_456L
+0X01AB_23CD
+0B1001_1101
+12E34_56
----------------------------------------------------
@@ -21,7 +26,12 @@
["number", "123.5e-10"],
["number", "123.5e+10"],
["number", "123.5f"],
- ["number", "123.5F"]
+ ["number", "123.5F"],
+ ["number", "123_456"],
+ ["number", "123_456L"],
+ ["number", "0X01AB_23CD"],
+ ["number", "0B1001_1101"],
+ ["number", "12E34_56"]
]
----------------------------------------------------