yggdrasil/syntaxes/Kotlin.sublime-syntax
xfy 5b481e801c feat: add custom .sublime-syntax loading for Swift and Kotlin, improve alias table
- Enable yaml-load feature in syntect to support loading .sublime-syntax files
- Load custom syntax definitions from syntaxes/ directory via SyntaxSet::into_builder
- Add Swift and Kotlin syntax definitions as .sublime-syntax files
- Fix alias table to properly resolve full language names (javascript,
  typescript, python, swift, kotlin, golang) via file extension lookup
- Redirect ts/typescript to JavaScript highlighting (syntect v5.3.0 does not
  support TypeScript's Sublime Text v2 syntax format)
- Add documentation comments to generate_highlight_css.rs binary
2026-06-05 09:27:21 +08:00

1037 lines
31 KiB
YAML

%YAML 1.2
---
name: Kotlin
file_extensions:
- kt
- kts
scope: source.kotlin
version: 2
variables:
identifier_start: '(?:[_\p{L}])'
identifier_part: '(?:[_\p{L}\p{Nd}])'
identifier: '(?:`[^`\r\n]+`|{{identifier_start}}{{identifier_part}}*)'
dec_digits: '(?:\d(?:[\d_]*\d)?)'
hex_digits: '(?:[0-9A-Fa-f](?:[0-9A-Fa-f_]*[0-9A-Fa-f])?)'
bin_digits: '(?:[01](?:[01_]*[01])?)'
contexts:
main:
- include: shebang
- include: declarations
- include: where-clauses
- include: standalone-generic-types
- include: annotations
- include: strings
- include: literals
- include: targeted-keywords
- include: callable-references
- include: labels
- include: operators
- include: keywords
- include: function-calls
- include: punctuation
- include: identifiers
prototype:
- include: comments
shebang:
- match: '\A(#!).*$'
scope: comment.line.shebang.kotlin
captures:
1: punctuation.definition.comment.kotlin
comments:
- match: '//'
scope: punctuation.definition.comment.kotlin
push: line-comment-body
- match: '/\*'
scope: punctuation.definition.comment.begin.kotlin
push: block-comment-body
line-comment-body:
- meta_include_prototype: false
- meta_scope: comment.line.double-slash.kotlin
- match: '$'
pop: true
block-comment-body:
- meta_include_prototype: false
- meta_scope: comment.block.kotlin
- match: '/\*'
scope: punctuation.definition.comment.begin.kotlin
push: block-comment-body
- match: '\*/'
scope: punctuation.definition.comment.end.kotlin
pop: true
declarations:
- match: '\bvalue\b(?=\s+class\b)'
scope: storage.modifier.kotlin
- match: '\bpackage\b'
scope: keyword.declaration.package.kotlin
push: package-statement
- match: '\bimport\b'
scope: keyword.control.import.kotlin
push: import-statement
- match: '\btypealias\b'
scope: keyword.declaration.typealias.kotlin
push: typealias-declaration
- match: '\bclass\b'
scope: keyword.declaration.class.kotlin
push: class-declaration
- match: '\binterface\b'
scope: keyword.declaration.interface.kotlin
push: interface-declaration
- match: '\bobject\b'
scope: keyword.declaration.object.kotlin
push: object-declaration
- match: '\bfun\b'
scope: keyword.declaration.function.kotlin
push: function-declaration
- match: '\b(?:val|var)\b'
scope: keyword.declaration.kotlin
push: property-declaration
package-statement:
- meta_content_scope: meta.namespace.kotlin
- match: '{{identifier}}(?=\s*\.)'
scope: variable.namespace.java
- match: '{{identifier}}'
scope: entity.name.namespace.package.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
- match: ';'
scope: punctuation.terminator.statement.kotlin
pop: true
- match: '$'
pop: true
import-statement:
- meta_content_scope: meta.import.kotlin
- match: '\bas\b'
scope: keyword.declaration.alias.kotlin
push: import-alias-name
- match: '{{identifier}}(?=\s+as\b)'
- match: '{{identifier}}(?=\s*(?:;|$))'
- match: '{{identifier}}(?=\s*\.)'
scope: support.module.kotlin
- match: '{{identifier}}'
- match: '\*'
scope: keyword.operator.wildcard.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
- match: ';'
scope: punctuation.terminator.statement.kotlin
pop: true
- match: '$'
pop: true
import-alias-name:
- match: '{{identifier}}'
scope: entity.name.import.alias.kotlin
pop: true
- match: '(?=\S)'
pop: true
typealias-declaration:
- meta_scope: meta.typealias.kotlin
- match: '{{identifier}}'
scope: entity.name.type.alias.kotlin
set: typealias-after-name
typealias-after-name:
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: type-arguments
- match: '='
scope: keyword.operator.assignment.kotlin
set: typealias-value
- match: '(?=[=;{])'
pop: true
- match: '(?=\b(?:package|import|class|interface|object|fun|val|var|typealias)\b)'
pop: true
- match: '$'
pop: true
typealias-value:
- meta_content_scope: meta.type.kotlin
- match: '$'
pop: true
- include: type-expression-content
class-declaration:
- meta_scope: meta.class.kotlin
- match: '{{identifier}}'
scope: entity.name.class.kotlin
set: class-after-name
class-after-name:
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: type-arguments
- match: '\b(?:public|private|protected|internal|enum|sealed|annotation|data|inner|tailrec|operator|inline|infix|external|suspend|override|abstract|final|open|const|lateinit|vararg|noinline|crossinline|reified|expect|actual|companion|value)\b'
scope: storage.modifier.kotlin
- match: '\bconstructor\b'
scope: keyword.declaration.kotlin
- match: '\('
scope: punctuation.section.parameters.begin.kotlin
push: class-parameters
- match: ':'
scope: punctuation.separator.type.kotlin
push: delegation-specifiers
- match: '(?=[{;=])'
pop: true
- match: '(?=\b(?:package|import|class|interface|object|fun|val|var|typealias)\b)'
pop: true
- match: '$'
pop: true
interface-declaration:
- meta_scope: meta.class.kotlin
- match: '{{identifier}}'
scope: entity.name.interface.kotlin
set: interface-after-name
interface-after-name:
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: type-arguments
- match: ':'
scope: punctuation.separator.type.kotlin
push: delegation-specifiers
- match: '(?=[{;=])'
pop: true
- match: '(?=\b(?:package|import|class|interface|object|fun|val|var|typealias)\b)'
pop: true
- match: '$'
pop: true
object-declaration:
- meta_scope: meta.class.kotlin
- match: '(?=[:{(])'
set: object-after-name
- match: '{{identifier}}'
scope: entity.name.class.kotlin
set: object-after-name
object-after-name:
- match: ':'
scope: punctuation.separator.type.kotlin
push: delegation-specifiers
- match: '(?=[{(])'
pop: true
- match: '(?=\b(?:package|import|class|interface|object|fun|val|var|typealias)\b)'
pop: true
- match: '$'
pop: true
function-declaration:
- meta_scope: meta.function.kotlin
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: type-arguments
- match: '{{identifier}}(?=\s*<)'
scope: support.type.kotlin
push: function-receiver-type-tail
- match: '{{identifier}}(?=\s*\.)'
scope: support.type.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
- match: '{{identifier}}'
scope: entity.name.function.kotlin
set: function-after-name
- match: '\('
scope: punctuation.section.parameters.begin.kotlin
set: function-parameters
- match: '(?=[={;])'
pop: true
- match: '(?=\b(?:package|import|class|interface|object|fun|val|var|typealias)\b)'
pop: true
function-receiver-type-tail:
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: value-type-arguments
- match: '\.'
scope: punctuation.accessor.dot.kotlin
pop: true
- match: '(?=\S)'
pop: true
function-after-name:
- match: '\('
scope: punctuation.section.parameters.begin.kotlin
push: function-parameters
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- match: '='
scope: keyword.operator.assignment.kotlin
pop: true
- match: '(?=[{;])'
pop: true
- match: '$'
pop: true
- match: '(?=\S)'
pop: true
class-parameters:
- meta_scope: meta.function.parameters.kotlin
- match: '\)'
scope: punctuation.section.parameters.end.kotlin
pop: true
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: nested-parentheses
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
push: nested-brackets
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: nested-braces
- include: class-parameter-tokens
class-parameter-tokens:
- include: annotations
- match: '\b(?:vararg|noinline|crossinline)\b'
scope: storage.modifier.kotlin
- match: '\b(?:val|var)\b'
scope: keyword.declaration.kotlin
push: property-parameter
- match: '{{identifier}}(?=\s*:)'
scope: variable.parameter.kotlin
- match: '{{identifier}}(?=\s*(?:=|,|\)))'
scope: variable.parameter.kotlin
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- match: '='
scope: keyword.operator.assignment.kotlin
- match: ','
scope: punctuation.separator.sequence.kotlin
- include: strings
- include: literals
- include: targeted-keywords
- include: callable-references
- include: labels
- include: operators
- include: keywords
- include: function-calls
- include: punctuation
- include: identifiers
property-parameter:
- meta_scope: meta.declaration.variable.kotlin
- match: '{{identifier}}(?=\s*:)'
scope: variable.parameter.kotlin
pop: true
- match: '{{identifier}}(?=\s*(?:=|,|\)))'
scope: variable.parameter.kotlin
pop: true
- include: annotations
- match: '(?=\S)'
pop: true
function-parameters:
- meta_scope: meta.function.parameters.kotlin
- match: '\)'
scope: punctuation.section.parameters.end.kotlin
pop: true
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: nested-parentheses
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
push: nested-brackets
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: nested-braces
- include: parameter-tokens
parameter-tokens:
- include: annotations
- match: '\b(?:vararg|noinline|crossinline|val|var)\b'
scope: storage.modifier.kotlin
- match: '{{identifier}}(?=\s*:)'
scope: variable.parameter.kotlin
- match: '{{identifier}}(?=\s*(?:=|,|\)))'
scope: variable.parameter.kotlin
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- match: '='
scope: keyword.operator.assignment.kotlin
- match: ','
scope: punctuation.separator.sequence.kotlin
- include: strings
- include: literals
- include: targeted-keywords
- include: callable-references
- include: labels
- include: operators
- include: keywords
- include: function-calls
- include: punctuation
- include: identifiers
property-declaration:
- meta_scope: meta.declaration.variable.kotlin
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: type-arguments
- match: '\('
scope: punctuation.section.group.begin.kotlin
set: destructuring-property-list
- match: '{{identifier}}(?=\s*<)'
scope: support.type.kotlin
push: property-receiver-type-tail
- match: '{{identifier}}(?=\s*\.)'
scope: support.type.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
- match: '{{identifier}}'
scope: variable.other.readwrite.kotlin
set: property-after-name
- match: '(?=[=;{])'
pop: true
- match: '(?=\b(?:package|import|class|interface|object|fun|val|var|typealias)\b)'
pop: true
property-receiver-type-tail:
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: value-type-arguments
- match: '\.'
scope: punctuation.accessor.dot.kotlin
pop: true
- match: '(?=\S)'
pop: true
property-after-name:
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- match: '\b(?:get|set)\b'
scope: keyword.declaration.kotlin
pop: true
- match: '\bby\b'
scope: keyword.operator.word.kotlin
pop: true
- match: '='
scope: keyword.operator.assignment.kotlin
pop: true
- match: '(?=\b(?:get|set)\b)'
pop: true
- match: '(?=[;{])'
pop: true
- match: '$'
pop: true
destructuring-property-list:
- meta_scope: meta.declaration.variable.kotlin
- match: '\)'
scope: punctuation.section.group.end.kotlin
pop: true
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: destructuring-property-list
- match: '{{identifier}}(?=\s*(?::|,|\)|=))'
scope: variable.other.readwrite.kotlin
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- match: ','
scope: punctuation.separator.sequence.kotlin
- include: annotations
- include: keywords
type-expression:
- meta_content_scope: meta.type.kotlin
- match: '(?=\?:)'
pop: true
- match: '(?=[=,)\]};>{])'
pop: true
- match: '(?=\b(?:by|get|set|where|package|import|class|interface|object|fun|val|var|typealias|if|else|when|for|while|do|throw|return|break|continue|catch|finally)\b)'
pop: true
- match: '$'
pop: true
- include: type-expression-content
type-condition:
- meta_content_scope: meta.type.kotlin
- match: '(?=\s*(?:->|&&|\|\||==|!=|===|!==|\)|,|;|\]|\}|$))'
pop: true
- include: type-expression-content
type-expression-content:
- include: annotations
- match: '\bdynamic\b'
scope: support.type.kotlin
- match: '\b(?:in|out)\b'
scope: storage.modifier.kotlin
- match: '\bsuspend\b'
scope: storage.modifier.kotlin
- match: '{{identifier}}'
scope: support.type.kotlin
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: type-arguments
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: type-parentheses
- match: '\)'
scope: punctuation.section.group.end.kotlin
- match: '->'
scope: punctuation.separator.return-type.kotlin
- match: '&'
scope: keyword.operator.type.intersection.kotlin
- match: '\?'
scope: keyword.operator.nullable.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
- match: ','
scope: punctuation.separator.sequence.kotlin
- match: '\*'
scope: keyword.operator.wildcard.kotlin
type-expression-list:
- meta_content_scope: meta.type.kotlin
- match: '(?=[{;=])'
pop: true
- match: '$'
pop: true
- match: ','
scope: punctuation.separator.sequence.kotlin
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: nested-parentheses
- include: type-expression-content
delegation-specifiers:
- meta_content_scope: meta.type.kotlin
- match: '(?=[{;=])'
pop: true
- match: '$'
pop: true
- match: ','
scope: punctuation.separator.sequence.kotlin
- match: '\bby\b'
scope: keyword.operator.word.kotlin
push: delegation-expression
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: delegation-arguments
- include: type-expression-content
delegation-expression:
- match: '(?=\s*(?:,|\{|;|$))'
pop: true
- include: strings
- include: literals
- include: targeted-keywords
- include: callable-references
- include: labels
- include: operators
- include: keywords
- include: punctuation
- include: identifiers
delegation-arguments:
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: delegation-arguments
- match: '\)'
scope: punctuation.section.group.end.kotlin
pop: true
- include: strings
- include: literals
- include: targeted-keywords
- include: callable-references
- include: labels
- include: operators
- include: keywords
- include: punctuation
- include: identifiers
type-parentheses:
- meta_scope: meta.group.kotlin
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: type-parentheses
- match: '\)'
scope: punctuation.section.group.end.kotlin
pop: true
- include: type-expression-content
type-arguments:
- meta_scope: meta.type.parameters.kotlin
- match: '>'
scope: punctuation.definition.typeparameters.end.kotlin
pop: true
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: type-arguments
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- include: type-expression-content
value-type-arguments:
- meta_scope: meta.type.parameters.kotlin
- match: '>'
scope: punctuation.definition.typeparameters.end.kotlin
pop: true
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: value-type-arguments
- match: '{{identifier}}'
scope: meta.type.kotlin support.type.kotlin
- match: '\?'
scope: meta.type.kotlin keyword.operator.nullable.kotlin
- match: '\*'
scope: meta.type.kotlin keyword.operator.wildcard.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
- match: ','
scope: punctuation.separator.sequence.kotlin
annotations:
- match: '(@)(?=\[)'
captures:
1: punctuation.definition.annotation.kotlin
push: annotation-group
- match: '(@)(file|field|property|get|set|receiver|param|setparam|delegate)(:)'
captures:
1: punctuation.definition.annotation.kotlin
2: variable.language.annotation-target.kotlin
3: punctuation.separator.annotation-target.kotlin
push: annotation-simple
- match: '@'
scope: punctuation.definition.annotation.kotlin
push: annotation-simple
annotation-simple:
- meta_scope: meta.annotation.kotlin
- match: '{{identifier}}'
scope: entity.name.annotation.kotlin
set: annotation-simple-after-name
- match: '(?=\S)'
pop: true
annotation-simple-after-name:
- meta_scope: meta.annotation.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
set: annotation-simple
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: annotation-arguments
- match: '(?=\S)'
pop: true
annotation-group:
- meta_scope: meta.annotation.group.kotlin
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
- match: '\]'
scope: punctuation.section.brackets.end.kotlin
pop: true
- match: '{{identifier}}'
scope: entity.name.annotation.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: annotation-arguments
annotation-arguments:
- meta_scope: meta.annotation.arguments.kotlin
- match: '\)'
scope: punctuation.section.group.end.kotlin
pop: true
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: annotation-arguments
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
push: nested-brackets
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: nested-braces
- include: main
strings:
- match: '"""'
scope: punctuation.definition.string.begin.kotlin
push: triple-string
- match: '"'
scope: punctuation.definition.string.begin.kotlin
push: line-string
line-string:
- meta_include_prototype: false
- meta_scope: meta.string.kotlin string.quoted.double.kotlin
- match: '"'
scope: punctuation.definition.string.end.kotlin
pop: true
- match: '\$\{'
scope: punctuation.section.interpolation.begin.kotlin
push: string-interpolation
- match: '\${{identifier}}'
scope: variable.other.interpolated.kotlin
- match: '\\(?:[tbnr''"\\$]|u[0-9A-Fa-f]{4})'
scope: constant.character.escape.kotlin
- match: '[^\\$"]+'
- match: '\$'
triple-string:
- meta_include_prototype: false
- meta_scope: meta.string.kotlin string.quoted.triple.kotlin
- match: '"{3,}'
scope: punctuation.definition.string.end.kotlin
pop: true
- match: '\$\{'
scope: punctuation.section.interpolation.begin.kotlin
push: string-interpolation
- match: '\${{identifier}}'
scope: variable.other.interpolated.kotlin
- match: '[^"$]+'
- match: '"{1,2}(?!")'
- match: '\$'
string-interpolation:
- clear_scopes: 1
- meta_scope: meta.interpolation.kotlin source.kotlin.embedded
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: interpolation-block
- match: '\bit\b'
scope: variable.language.kotlin
- match: '\}'
scope: punctuation.section.interpolation.end.kotlin
pop: true
- include: main
interpolation-block:
- clear_scopes: 1
- meta_scope: source.kotlin.embedded
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: interpolation-block
- match: '\bit\b'
scope: variable.language.kotlin
- match: '\}'
scope: punctuation.section.block.end.kotlin
pop: true
- include: main
nested-parentheses:
- meta_scope: meta.group.kotlin
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: nested-parentheses
- match: '\)'
scope: punctuation.section.group.end.kotlin
pop: true
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
push: nested-brackets
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: nested-braces
- include: main
nested-brackets:
- meta_scope: meta.brackets.kotlin
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
push: nested-brackets
- match: '\]'
scope: punctuation.section.brackets.end.kotlin
pop: true
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: nested-parentheses
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: nested-braces
- include: main
nested-braces:
- meta_scope: meta.block.kotlin
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: nested-braces
- match: '\}'
scope: punctuation.section.block.end.kotlin
pop: true
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: nested-parentheses
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
push: nested-brackets
- include: main
literals:
- match: '(?:0[xX]{{hex_digits}}|0[bB]{{bin_digits}}|{{dec_digits}})[uU][lL]?\b'
scope: constant.numeric.integer.kotlin
- match: '(?:0[xX]{{hex_digits}}|0[bB]{{bin_digits}}|{{dec_digits}})[lL]\b'
scope: constant.numeric.integer.kotlin
- match: '(?:{{dec_digits}}?\.{{dec_digits}}(?:[eE][+-]?{{dec_digits}})?|{{dec_digits}}[eE][+-]?{{dec_digits}}|{{dec_digits}}[fF])(?:[fF])?\b'
scope: constant.numeric.float.kotlin
- match: '0[xX]{{hex_digits}}\b'
scope: constant.numeric.integer.hexadecimal.kotlin
- match: '0[bB]{{bin_digits}}\b'
scope: constant.numeric.integer.binary.kotlin
- match: '{{dec_digits}}\b'
scope: constant.numeric.integer.decimal.kotlin
- match: '''(?:\\u[0-9A-Fa-f]{4}|\\[tbnr''"\\$]|[^''\\\r\n])'''
scope: constant.character.kotlin
- match: '\b(?:true|false)\b'
scope: constant.language.boolean.kotlin
- match: '\bnull\b'
scope: constant.language.null.kotlin
targeted-keywords:
- match: '\b(return|continue|break)(@)({{identifier}})'
captures:
1: keyword.control.flow.jump.kotlin
2: punctuation.definition.label.kotlin
3: entity.name.label.kotlin
- match: '\b(this|super)(@)({{identifier}})'
captures:
1: variable.language.kotlin
2: punctuation.definition.label.kotlin
3: entity.name.label.kotlin
where-clauses:
- match: '(?<!\.)\bwhere\b'
scope: keyword.declaration.kotlin
push: where-constraints
where-constraints:
- match: '^(?=\s*(?:@|package|import|class|interface|object|fun|val|var|typealias|public|private|protected|internal|enum|sealed|annotation|data|inner|tailrec|operator|inline|infix|external|suspend|override|abstract|final|open|const|lateinit|vararg|noinline|crossinline|reified|expect|actual|companion)\b)'
pop: true
- match: '(?=[{=])'
pop: true
- match: '{{identifier}}(?=\s*:)'
scope: meta.type.kotlin support.type.kotlin
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- match: ','
scope: punctuation.separator.sequence.kotlin
standalone-generic-types:
- match: '{{identifier}}(?=\s*<[^(){}\n]+>\s*(?:\{|$))'
scope: meta.type.kotlin support.type.kotlin
push: standalone-generic-type-tail
standalone-generic-type-tail:
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: value-type-arguments
- match: '(?=\S)'
pop: true
callable-references:
- match: '(::)(class)\b'
captures:
1: punctuation.accessor.callable-reference.kotlin
2: keyword.other.kotlin
- match: '(::)({{identifier}})'
captures:
1: punctuation.accessor.callable-reference.kotlin
2: variable.function.kotlin
labels:
- match: '({{identifier}})(@)'
captures:
1: entity.name.label.kotlin
2: punctuation.definition.label.kotlin
operators:
- match: '\?:'
scope: keyword.operator.elvis.kotlin
- match: '\?\.'
scope: punctuation.accessor.null-safe.kotlin
- match: '!!'
scope: keyword.operator.null-assertion.kotlin
- match: '!is\b'
scope: keyword.operator.word.kotlin
push: type-condition
- match: '!in\b'
scope: keyword.operator.word.kotlin
- match: '\bas\?'
scope: keyword.operator.word.kotlin
push: type-expression
- match: '\bas\b'
scope: keyword.operator.word.kotlin
push: type-expression
- match: '\bis\b'
scope: keyword.operator.word.kotlin
push: type-condition
- match: '\bin\b'
scope: keyword.operator.word.kotlin
- match: '\buntil\b'
scope: keyword.operator.word.kotlin
- match: '\bby\b'
scope: keyword.operator.word.kotlin
- match: '==='
scope: keyword.operator.comparison.kotlin
- match: '!=='
scope: keyword.operator.comparison.kotlin
- match: '=='
scope: keyword.operator.comparison.kotlin
- match: '!='
scope: keyword.operator.comparison.kotlin
- match: '<='
scope: keyword.operator.comparison.kotlin
- match: '>='
scope: keyword.operator.comparison.kotlin
- match: '\.\.<'
scope: keyword.operator.range.kotlin
- match: '\.\.'
scope: keyword.operator.range.kotlin
- match: '->'
scope: punctuation.separator.when.kotlin
- match: '\+='
scope: keyword.operator.assignment.augmented.kotlin
- match: '-='
scope: keyword.operator.assignment.augmented.kotlin
- match: '\*='
scope: keyword.operator.assignment.augmented.kotlin
- match: '/='
scope: keyword.operator.assignment.augmented.kotlin
- match: '%='
scope: keyword.operator.assignment.augmented.kotlin
- match: '='
scope: keyword.operator.assignment.kotlin
- match: '\+\+'
scope: keyword.operator.arithmetic.kotlin
- match: '--'
scope: keyword.operator.arithmetic.kotlin
- match: '&&'
scope: keyword.operator.logical.kotlin
- match: '\|\|'
scope: keyword.operator.logical.kotlin
- match: '!'
scope: keyword.operator.logical.kotlin
- match: '\+'
scope: keyword.operator.arithmetic.kotlin
- match: '-'
scope: keyword.operator.arithmetic.kotlin
- match: '\*'
scope: keyword.operator.arithmetic.kotlin
- match: '/'
scope: keyword.operator.arithmetic.kotlin
- match: '%'
scope: keyword.operator.arithmetic.kotlin
- match: '<'
scope: keyword.operator.comparison.kotlin
- match: '>'
scope: keyword.operator.comparison.kotlin
- match: ':'
scope: punctuation.separator.type.kotlin
push: type-expression
- match: '\?'
scope: keyword.operator.nullable.kotlin
keywords:
- match: '\b(?:if|else|when)\b'
scope: keyword.control.conditional.kotlin
- match: '\b(?:try|catch|finally)\b'
scope: keyword.control.exception.kotlin
- match: '\b(?:for|while|do)\b'
scope: keyword.control.loop.kotlin
- match: '\b(?:throw|return|continue|break)\b'
scope: keyword.control.flow.jump.kotlin
- match: '\b(?:this|super)\b'
scope: variable.language.kotlin
- match: '\b(?:constructor|init)\b'
scope: keyword.declaration.kotlin
- match: '\b(?:public|private|protected|internal|enum|sealed|annotation|data|inner|tailrec|operator|inline|infix|external|suspend|override|abstract|final|open|const|lateinit|vararg|noinline|crossinline|reified|expect|actual|companion|out)\b'
scope: storage.modifier.kotlin
function-calls:
- match: '{{identifier}}(?=\s*<[^(){}\n]+>\s*\()'
scope: variable.function.kotlin
push: function-call-tail
- match: '{{identifier}}(?=\s*\()'
scope: variable.function.kotlin
push: function-call-tail
- match: '{{identifier}}(?=\s*\{)'
scope: variable.function.kotlin
push: function-call-tail
function-call-tail:
- match: '<'
scope: punctuation.definition.typeparameters.begin.kotlin
push: value-type-arguments
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: function-call-arguments
- match: '\{'
scope: punctuation.section.block.begin.kotlin
push: lambda-body
- match: '(?=\S)'
pop: true
function-call-arguments:
- match: '\('
scope: punctuation.section.group.begin.kotlin
push: function-call-arguments
- match: '\)'
scope: punctuation.section.group.end.kotlin
pop: true
- include: main
lambda-body:
- meta_scope: meta.lambda.kotlin
- match: '(?={{identifier}}\s*(?:,|->))'
push: lambda-parameters
- match: '\bit\b'
scope: variable.language.kotlin
- match: '\}'
scope: punctuation.section.block.end.kotlin
pop: true
- include: main
lambda-parameters:
- match: '{{identifier}}(?=\s*(?:,|->))'
scope: variable.parameter.kotlin
- match: ','
scope: punctuation.separator.sequence.kotlin
- match: '->'
scope: keyword.declaration.function.arrow.kotlin
pop: true
- match: '(?=\S)'
pop: true
punctuation:
- match: '\{'
scope: punctuation.section.block.begin.kotlin
- match: '\}'
scope: punctuation.section.block.end.kotlin
- match: '\('
scope: punctuation.section.group.begin.kotlin
- match: '\)'
scope: punctuation.section.group.end.kotlin
- match: '\['
scope: punctuation.section.brackets.begin.kotlin
- match: '\]'
scope: punctuation.section.brackets.end.kotlin
- match: ','
scope: punctuation.separator.sequence.kotlin
- match: ';'
scope: punctuation.terminator.statement.kotlin
- match: '\.'
scope: punctuation.accessor.dot.kotlin
identifiers:
- match: '{{identifier}}'
scope: variable.other.readwrite.kotlin