{ "name": "Kotlin", "scopeName": "source.kotlin", "patterns": [ { "include": "#comments" }, { "match": "^\\s*(package)\\b(?:\\s*([^ ;$]+)\\s*)?", "captures": { "1": { "name": "keyword.other.kotlin" }, "2": { "name": "entity.name.package.kotlin" } } }, { "include": "#imports" }, { "include": "#statements" } ], "repository": { "annotations": { "patterns": [ { "name": "meta.declaration.annotation.kotlin", "begin": "(@[^ (]+)(\\()", "end": "(\\))", "patterns": [ { "match": "(\\w*)\\s*(=)", "captures": { "1": { "name": "constant.other.key.kotlin" }, "2": { "name": "keyword.operator.assignment.kotlin" } } }, { "include": "#statements" }, { "name": "punctuation.seperator.property.kotlin", "match": "," } ], "beginCaptures": { "1": { "name": "storage.type.annotation.kotlin" }, "2": { "name": "punctuation.definition.annotation-arguments.begin.kotlin" } }, "endCaptures": { "1": { "name": "punctuation.definition.annotation-arguments.end.kotlin" } } }, { "name": "storage.type.annotation.kotlin", "match": "@\\w*" } ] }, "classes": { "begin": "(?\u003c!::)(?=\\b(?:companion|class|object|interface)\\b)", "end": "(?=$|\\})", "patterns": [ { "include": "#comments" }, { "begin": "\\b(companion\\s*)?(class|object|interface)\\b", "end": "(?=\u003c|\\{|\\(|:|$)", "patterns": [ { "include": "#comments" }, { "name": "entity.name.type.class.kotlin", "match": "\\w+" } ], "beginCaptures": { "1": { "name": "storage.modifier.kotlin" }, "2": { "name": "storage.modifier.kotlin" } } }, { "begin": "\u003c", "end": "\u003e", "patterns": [ { "include": "#generics" } ] }, { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#parameters" } ] }, { "begin": "(:)", "end": "(?={|$)", "patterns": [ { "name": "entity.other.inherited-class.kotlin", "match": "\\w+" }, { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#expressions" } ] } ], "beginCaptures": { "1": { "name": "keyword.operator.declaration.kotlin" } } }, { "begin": "\\{", "end": "\\}", "patterns": [ { "include": "#statements" } ] } ] }, "comments": { "patterns": [ { "name": "comment.block.empty.kotlin", "match": "/\\*\\*/", "captures": { "0": { "name": "punctuation.definition.comment.kotlin" } } }, { "include": "text.html.javadoc" }, { "include": "#comments-inline" } ] }, "comments-inline": { "patterns": [ { "name": "comment.block.kotlin", "begin": "/\\*", "end": "\\*/", "captures": { "0": { "name": "punctuation.definition.comment.kotlin" } } }, { "match": "\\s*((//).*$\\n?)", "captures": { "1": { "name": "comment.line.double-slash.kotlin" }, "2": { "name": "punctuation.definition.comment.kotlin" } } } ] }, "constants": { "patterns": [ { "name": "constant.language.kotlin", "match": "\\b(true|false|null|this|super)\\b" }, { "name": "constant.numeric.kotlin", "match": "\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)([LlFfUuDd]|UL|ul)?\\b" }, { "name": "constant.other.kotlin", "match": "\\b([A-Z][A-Z0-9_]+)\\b" } ] }, "expressions": { "patterns": [ { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#expressions" } ] }, { "include": "#types" }, { "include": "#strings" }, { "include": "#constants" }, { "include": "#comments" }, { "include": "#keywords" } ] }, "functions": { "begin": "(?=\\s*\\b(?:fun)\\b)", "end": "(?=$|\\})", "patterns": [ { "begin": "\\b(fun)\\b", "end": "(?=\\()", "patterns": [ { "begin": "\u003c", "end": "\u003e", "patterns": [ { "include": "#generics" } ] }, { "match": "([\\.\u003c\\?\u003e\\w]+\\.)?(\\w+)", "captures": { "2": { "name": "entity.name.function.kotlin" } } } ], "beginCaptures": { "1": { "name": "keyword.other.kotlin" } } }, { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#parameters" } ] }, { "begin": "(:)", "end": "(?={|=|$)", "patterns": [ { "include": "#types" } ], "beginCaptures": { "1": { "name": "keyword.operator.declaration.kotlin" } } }, { "begin": "\\{", "end": "(?=\\})", "patterns": [ { "include": "#statements" } ] }, { "begin": "(=)", "end": "(?=$)", "patterns": [ { "include": "#expressions" } ], "beginCaptures": { "1": { "name": "keyword.operator.assignment.kotlin" } } } ] }, "generics": { "patterns": [ { "begin": "(:)", "end": "(?=,|\u003e)", "patterns": [ { "include": "#types" } ], "beginCaptures": { "1": { "name": "keyword.operator.declaration.kotlin" } } }, { "include": "#keywords" }, { "name": "storage.type.generic.kotlin", "match": "\\w+" } ] }, "getters-and-setters": { "patterns": [ { "begin": "\\b(get)\\b\\s*\\(\\s*\\)", "end": "\\}|(?=\\bset\\b)|$", "patterns": [ { "begin": "(=)", "end": "(?=$|\\bset\\b)", "patterns": [ { "include": "#expressions" } ], "beginCaptures": { "1": { "name": "keyword.operator.assignment.kotlin" } } }, { "begin": "\\{", "end": "\\}", "patterns": [ { "include": "#expressions" } ] } ], "beginCaptures": { "1": { "name": "entity.name.function.kotlin" } } }, { "begin": "\\b(set)\\b\\s*(?=\\()", "end": "\\}|(?=\\bget\\b)|$", "patterns": [ { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#parameters" } ] }, { "begin": "(=)", "end": "(?=$|\\bset\\b)", "patterns": [ { "include": "#expressions" } ], "beginCaptures": { "1": { "name": "keyword.operator.assignment.kotlin" } } }, { "begin": "\\{", "end": "\\}", "patterns": [ { "include": "#expressions" } ] } ], "beginCaptures": { "1": { "name": "entity.name.function.kotlin" } } } ] }, "imports": { "patterns": [ { "match": "^\\s*(import)\\s+[^ $.]+(\\.([`][^$`]+[`]|[^` $.]+))+\\s+(as)?", "captures": { "1": { "name": "keyword.other.kotlin" }, "4": { "name": "keyword.other.kotlin" } } } ] }, "keywords": { "patterns": [ { "name": "storage.modifier.kotlin", "match": "\\b(var|val|external|public|private|protected|abstract|final|sealed|enum|open|attribute|annotation|override|inline|vararg|in|out|internal|data|tailrec|operator|infix|const|yield|typealias|typeof|expect|actual|reified|suspend)\\b" }, { "name": "keyword.control.catch-exception.kotlin", "match": "\\b(try|catch|finally|throw)\\b" }, { "name": "keyword.control.kotlin", "match": "\\b(if|else|while|for|do|return|when|where|break|continue)\\b" }, { "name": "keyword.operator.kotlin", "match": "\\b(in|is|as|assert)\\b" }, { "name": "keyword.operator.comparison.kotlin", "match": "(==|!=|===|!==|\u003c=|\u003e=|\u003c|\u003e)" }, { "name": "keyword.operator.assignment.kotlin", "match": "(=)" }, { "name": "keyword.operator.reference.kotlin", "match": "(::)" }, { "name": "keyword.operator.declaration.kotlin", "match": "(:)" }, { "name": "keyword.operator.dot.kotlin", "match": "(\\.)" }, { "name": "keyword.operator.dot.kotlin", "match": "(\\?\\.)" }, { "name": "keyword.operator.elvis.kotlin", "match": "(\\?:)" }, { "name": "keyword.operator.increment-decrement.kotlin", "match": "(\\-\\-|\\+\\+)" }, { "name": "keyword.operator.arithmetic.kotlin", "match": "(\\-|\\+|\\*|\\/|%)" }, { "name": "keyword.operator.arithmetic.assign.kotlin", "match": "(\\+=|\\-=|\\*=|\\/=)" }, { "name": "keyword.operator.logical.kotlin", "match": "(!|\u0026\u0026|\\|\\|)" }, { "name": "keyword.operator.range.kotlin", "match": "(\\.\\.)" }, { "name": "punctuation.terminator.kotlin", "match": "(;)" } ] }, "namespaces": { "patterns": [ { "name": "keyword.other.kotlin", "match": "\\b(namespace)\\b" }, { "begin": "\\{", "end": "\\}", "patterns": [ { "include": "#statements" } ] } ] }, "parameters": { "patterns": [ { "begin": "(:)", "end": "(?=,|\\)|=)", "patterns": [ { "include": "#types" } ], "beginCaptures": { "1": { "name": "keyword.operator.declaration.kotlin" } } }, { "begin": "(=)", "end": "(?=,|\\))", "patterns": [ { "include": "#expressions" } ], "beginCaptures": { "1": { "name": "keyword.operator.declaration.kotlin" } } }, { "include": "#keywords" }, { "name": "variable.parameter.function.kotlin", "match": "\\w+" } ] }, "statements": { "patterns": [ { "include": "#namespaces" }, { "include": "#annotations" }, { "include": "#typedefs" }, { "include": "#classes" }, { "include": "#functions" }, { "include": "#variables" }, { "include": "#getters-and-setters" }, { "include": "#expressions" } ] }, "strings": { "patterns": [ { "name": "string.quoted.third.kotlin", "begin": "\"\"\"", "end": "\"\"\"", "patterns": [ { "name": "variable.parameter.template.kotlin", "match": "(\\$\\w+|\\$\\{[^\\}]+\\})" }, { "name": "constant.character.escape.kotlin", "match": "\\\\." } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.kotlin" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.kotlin" } } }, { "name": "string.quoted.double.kotlin", "begin": "\"", "end": "\"", "patterns": [ { "name": "variable.parameter.template.kotlin", "match": "(\\$\\w+|\\$\\{[^\\}]+\\})" }, { "name": "constant.character.escape.kotlin", "match": "\\\\." } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.kotlin" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.kotlin" } } }, { "name": "string.quoted.single.kotlin", "begin": "'", "end": "'", "patterns": [ { "name": "constant.character.escape.kotlin", "match": "\\\\." } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.kotlin" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.kotlin" } } }, { "name": "string.quoted.single.kotlin", "begin": "`", "end": "`", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.kotlin" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.kotlin" } } } ] }, "typedefs": { "begin": "(?=\\s*(?:type))", "end": "(?=$)", "patterns": [ { "name": "keyword.other.kotlin", "match": "\\b(type)\\b" }, { "begin": "\u003c", "end": "\u003e", "patterns": [ { "include": "#generics" } ] }, { "include": "#expressions" } ] }, "types": { "patterns": [ { "name": "storage.type.builtin.kotlin", "match": "\\b(Nothing|Any|Unit|String|CharSequence|Int|Boolean|Char|Long|Double|Float|Short|Byte|dynamic)\\b" }, { "name": "storage.type.builtin.array.kotlin", "match": "\\b(IntArray|BooleanArray|CharArray|LongArray|DoubleArray|FloatArray|ShortArray|ByteArray)\\b" }, { "begin": "\\b(Array|List|Map)\u003c\\b", "end": "\u003e", "patterns": [ { "include": "#types" }, { "include": "#keywords" } ], "beginCaptures": { "1": { "name": "storage.type.builtin.collection.kotlin" } } }, { "begin": "\\w+\u003c", "end": "\u003e", "patterns": [ { "include": "#types" }, { "include": "#keywords" } ] }, { "begin": "\\{", "end": "\\}", "patterns": [ { "include": "#statements" } ] }, { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#types" } ] }, { "name": "keyword.operator.declaration.kotlin", "match": "(-\u003e)" } ] }, "variables": { "begin": "(?=\\s*\\b(?:var|val)\\b)", "end": "(?=:|=|(\\b(by)\\b)|$)", "patterns": [ { "begin": "\\b(var|val)\\b", "end": "(?=:|=|(\\b(by)\\b)|$)", "patterns": [ { "begin": "\u003c", "end": "\u003e", "patterns": [ { "include": "#generics" } ] }, { "match": "([\\.\u003c\\?\u003e\\w]+\\.)?(\\w+)", "captures": { "2": { "name": "entity.name.variable.kotlin" } } } ], "beginCaptures": { "1": { "name": "keyword.other.kotlin" } } }, { "begin": "(:)", "end": "(?==|$)", "patterns": [ { "include": "#types" }, { "include": "#getters-and-setters" } ], "beginCaptures": { "1": { "name": "keyword.operator.declaration.kotlin" } } }, { "begin": "\\b(by)\\b", "end": "(?=$)", "patterns": [ { "include": "#expressions" } ], "beginCaptures": { "1": { "name": "keyword.other.kotlin" } } }, { "begin": "(=)", "end": "(?=$)", "patterns": [ { "include": "#expressions" }, { "include": "#getters-and-setters" } ], "beginCaptures": { "1": { "name": "keyword.operator.assignment.kotlin" } } } ] } } }