kotlinLanguage top-level constant
Language
const kotlinLanguage
Kotlin (source.kotlin).
Implementation
const kotlinLanguage = Language(
name: 'kotlin',
scopeName: 'source.kotlin',
displayName: 'Kotlin',
aliases: ['kt', 'kts'],
grammar: <String, Object?>{
'displayName': 'Kotlin',
'fileTypes': ['kt', 'kts'],
'name': 'kotlin',
'patterns': [
{'include': '#import'},
{'include': '#package'},
{'include': '#code'},
],
'repository': {
'annotation-simple': {
'match': '(?<!\\w)@[.\\w]+\\b(?!:)',
'name': 'entity.name.type.annotation.kotlin',
},
'annotation-site': {
'begin': '(?<!\\w)(@\\w+):\\s*(?!\\[)',
'beginCaptures': {
'1': {'name': 'entity.name.type.annotation-site.kotlin'},
},
'end': '\$',
'patterns': [
{'include': '#unescaped-annotation'},
],
},
'annotation-site-list': {
'begin': '(?<!\\w)(@\\w+):\\s*\\[',
'beginCaptures': {
'1': {'name': 'entity.name.type.annotation-site.kotlin'},
},
'end': ']',
'patterns': [
{'include': '#unescaped-annotation'},
],
},
'binary-literal': {
'match': '0([Bb])[01][01_]*',
'name': 'constant.numeric.binary.kotlin',
},
'boolean-literal': {
'match': '\\b(true|false)\\b',
'name': 'constant.language.boolean.kotlin',
},
'character': {
'begin': '\'',
'end': '\'',
'name': 'string.quoted.single.kotlin',
'patterns': [
{'match': '\\\\.', 'name': 'constant.character.escape.kotlin'},
],
},
'class-declaration': {
'captures': {
'1': {'name': 'keyword.hard.class.kotlin'},
'2': {'name': 'entity.name.type.class.kotlin'},
'3': {
'patterns': [
{'include': '#type-parameter'},
],
},
},
'match':
'\\b(class|(?:fun\\s+)?interface)\\s+(\\b\\w+\\b|`[^`]+`)\\s*(?<GROUP><([^<>]|\\g<GROUP>)+>)?',
},
'code': {
'patterns': [
{'include': '#comments'},
{'include': '#keywords'},
{'include': '#annotation-simple'},
{'include': '#annotation-site-list'},
{'include': '#annotation-site'},
{'include': '#class-declaration'},
{'include': '#object'},
{'include': '#type-alias'},
{'include': '#function'},
{'include': '#variable-declaration'},
{'include': '#type-constraint'},
{'include': '#type-annotation'},
{'include': '#function-call'},
{'include': '#method-reference'},
{'include': '#key'},
{'include': '#string'},
{'include': '#string-empty'},
{'include': '#string-multiline'},
{'include': '#character'},
{'include': '#lambda-arrow'},
{'include': '#operators'},
{'include': '#self-reference'},
{'include': '#decimal-literal'},
{'include': '#hex-literal'},
{'include': '#binary-literal'},
{'include': '#boolean-literal'},
{'include': '#null-literal'},
],
},
'comment-block': {
'begin': '/\\*(?!\\*)',
'end': '\\*/',
'name': 'comment.block.kotlin',
},
'comment-javadoc': {
'patterns': [
{
'begin': '/\\*\\*',
'end': '\\*/',
'name': 'comment.block.javadoc.kotlin',
'patterns': [
{
'match':
'@(return|constructor|receiver|sample|see|author|since|suppress)\\b',
'name': 'keyword.other.documentation.javadoc.kotlin',
},
{
'captures': {
'1': {'name': 'keyword.other.documentation.javadoc.kotlin'},
'2': {'name': 'variable.parameter.kotlin'},
},
'match': '(@p(?:aram|roperty))\\s+(\\S+)',
},
{
'captures': {
'1': {'name': 'keyword.other.documentation.javadoc.kotlin'},
'2': {'name': 'variable.parameter.kotlin'},
},
'match': '(@param)\\[(\\S+)]',
},
{
'captures': {
'1': {'name': 'keyword.other.documentation.javadoc.kotlin'},
'2': {'name': 'entity.name.type.class.kotlin'},
},
'match': '(@(?:exception|throws))\\s+(\\S+)',
},
{
'captures': {
'1': {'name': 'keyword.other.documentation.javadoc.kotlin'},
'2': {'name': 'entity.name.type.class.kotlin'},
'3': {'name': 'variable.parameter.kotlin'},
},
'match': '\\{(@link)\\s+(\\S+)?#([\$\\w]+\\s*\\([^()]*\\)).*}',
},
],
},
],
},
'comment-line': {
'begin': '//',
'end': '\$',
'name': 'comment.line.double-slash.kotlin',
},
'comments': {
'patterns': [
{'include': '#comment-line'},
{'include': '#comment-block'},
{'include': '#comment-javadoc'},
],
},
'control-keywords': {
'match':
'\\b(if|else|while|do|when|try|throw|break|continue|return|for)\\b',
'name': 'keyword.control.kotlin',
},
'decimal-literal': {
'match': '\\b\\d[_\\d]*(\\.[_\\d]+)?(([Ee])\\d+)?([Uu])?([FLf])?\\b',
'name': 'constant.numeric.decimal.kotlin',
},
'function': {
'captures': {
'1': {'name': 'keyword.hard.fun.kotlin'},
'2': {
'patterns': [
{'include': '#type-parameter'},
],
},
'4': {'name': 'entity.name.type.class.extension.kotlin'},
'5': {'name': 'entity.name.function.declaration.kotlin'},
},
'match':
'\\b(fun)\\b\\s*(?<GROUP><([^<>]|\\g<GROUP>)+>)?\\s*(?:(?:(\\w+)\\.)?(\\b\\w+\\b|`[^`]+`))?',
},
'function-call': {
'captures': {
'1': {'name': 'entity.name.function.call.kotlin'},
'2': {
'patterns': [
{'include': '#type-parameter'},
],
},
},
'match':
'\\??\\.?(\\b\\w+\\b|`[^`]+`)\\s*(?<GROUP><([^<>]|\\g<GROUP>)+>)?\\s*(?=[({])',
},
'hard-keywords': {
'match': '\\b(as|typeof|is|in)\\b',
'name': 'keyword.hard.kotlin',
},
'hex-literal': {
'match': '0([Xx])\\h[_\\h]*([Uu])?',
'name': 'constant.numeric.hex.kotlin',
},
'import': {
'begin': '\\b(import)\\b\\s*',
'beginCaptures': {
'1': {'name': 'keyword.soft.kotlin'},
},
'contentName': 'entity.name.package.kotlin',
'end': ';|\$',
'name': 'meta.import.kotlin',
'patterns': [
{'include': '#comments'},
{'include': '#hard-keywords'},
{'match': '\\*', 'name': 'variable.language.wildcard.kotlin'},
],
},
'key': {
'captures': {
'1': {'name': 'variable.parameter.kotlin'},
'2': {'name': 'keyword.operator.assignment.kotlin'},
},
'match': '\\b(\\w=)\\s*(=)',
},
'keywords': {
'patterns': [
{'include': '#prefix-modifiers'},
{'include': '#postfix-modifiers'},
{'include': '#soft-keywords'},
{'include': '#hard-keywords'},
{'include': '#control-keywords'},
],
},
'lambda-arrow': {
'match': '->',
'name': 'storage.type.function.arrow.kotlin',
},
'method-reference': {
'captures': {
'1': {'name': 'entity.name.function.reference.kotlin'},
},
'match': '\\??::(\\b\\w+\\b|`[^`]+`)',
},
'null-literal': {
'match': '\\bnull\\b',
'name': 'constant.language.null.kotlin',
},
'object': {
'captures': {
'1': {'name': 'keyword.hard.object.kotlin'},
'2': {'name': 'entity.name.type.object.kotlin'},
},
'match': '\\b(object)(?:\\s+(\\b\\w+\\b|`[^`]+`))?',
},
'operators': {
'patterns': [
{
'match': '(===?|!==?|<=|>=|[<>])',
'name': 'keyword.operator.comparison.kotlin',
},
{
'match': '([-%*+/]=)',
'name': 'keyword.operator.assignment.arithmetic.kotlin',
},
{'match': '(=)', 'name': 'keyword.operator.assignment.kotlin'},
{'match': '([-%*+/])', 'name': 'keyword.operator.arithmetic.kotlin'},
{'match': '(!|&&|\\|\\|)', 'name': 'keyword.operator.logical.kotlin'},
{
'match': '(--|\\+\\+)',
'name': 'keyword.operator.increment-decrement.kotlin',
},
{'match': '(\\.\\.)', 'name': 'keyword.operator.range.kotlin'},
],
},
'package': {
'begin': '\\b(package)\\b\\s*',
'beginCaptures': {
'1': {'name': 'keyword.hard.package.kotlin'},
},
'contentName': 'entity.name.package.kotlin',
'end': ';|\$',
'name': 'meta.package.kotlin',
'patterns': [
{'include': '#comments'},
],
},
'postfix-modifiers': {
'match': '\\b(where|by|get|set)\\b',
'name': 'storage.modifier.other.kotlin',
},
'prefix-modifiers': {
'match':
'\\b(abstract|final|enum|open|annotation|sealed|data|override|final|lateinit|private|protected|public|internal|inner|companion|noinline|crossinline|vararg|reified|tailrec|operator|infix|inline|external|const|suspend|value)\\b',
'name': 'storage.modifier.other.kotlin',
},
'self-reference': {
'match': '\\b(this|super)(@\\w+)?\\b',
'name': 'variable.language.this.kotlin',
},
'soft-keywords': {
'match': '\\b(init|catch|finally|field)\\b',
'name': 'keyword.soft.kotlin',
},
'string': {
'begin': '(?<!")"(?!")',
'end': '"',
'name': 'string.quoted.double.kotlin',
'patterns': [
{'match': '\\\\.', 'name': 'constant.character.escape.kotlin'},
{'include': '#string-escape-simple'},
{'include': '#string-escape-bracketed'},
],
},
'string-empty': {
'match': '(?<!")""(?!")',
'name': 'string.quoted.double.kotlin',
},
'string-escape-bracketed': {
'begin': '(?<!\\\\)(\\\$\\{)',
'beginCaptures': {
'1': {'name': 'punctuation.definition.template-expression.begin'},
},
'end': '(})',
'endCaptures': {
'1': {'name': 'punctuation.definition.template-expression.end'},
},
'name': 'meta.template.expression.kotlin',
'patterns': [
{'include': '#code'},
],
},
'string-escape-simple': {
'match': '(?<!\\\\)\\\$\\w+\\b',
'name': 'variable.string-escape.kotlin',
},
'string-multiline': {
'begin': '"""',
'end': '"""',
'name': 'string.quoted.double.kotlin',
'patterns': [
{'match': '\\\\.', 'name': 'constant.character.escape.kotlin'},
{'include': '#string-escape-simple'},
{'include': '#string-escape-bracketed'},
],
},
'type-alias': {
'captures': {
'1': {'name': 'keyword.hard.typealias.kotlin'},
'2': {'name': 'entity.name.type.kotlin'},
'3': {
'patterns': [
{'include': '#type-parameter'},
],
},
},
'match':
'\\b(typealias)\\s+(\\b\\w+\\b|`[^`]+`)\\s*(?<GROUP><([^<>]|\\g<GROUP>)+>)?',
},
'type-annotation': {
'captures': {
'0': {
'patterns': [
{'include': '#type-parameter'},
],
},
},
'match':
'(?<![:?]):\\s*([?\\w\\s]|->|(?<GROUP>[(<]([^"\'()<>]|\\g<GROUP>)+[)>]))+',
},
'type-parameter': {
'patterns': [
{'match': '\\b\\w+\\b', 'name': 'entity.name.type.kotlin'},
{'match': '\\b(in|out)\\b', 'name': 'storage.modifier.kotlin'},
],
},
'unescaped-annotation': {
'match': '\\b[.\\w]+\\b',
'name': 'entity.name.type.annotation.kotlin',
},
'variable-declaration': {
'captures': {
'1': {'name': 'keyword.hard.kotlin'},
'2': {
'patterns': [
{'include': '#type-parameter'},
],
},
},
'match': '\\b(va[lr])\\b\\s*(?<GROUP><([^<>]|\\g<GROUP>)+>)?',
},
},
'scopeName': 'source.kotlin',
},
);