tm-grammars
Version:
Collecton of TextMate grammars in JSON
931 lines (930 loc) • 24.8 kB
JSON
{
"displayName": "Luau",
"fileTypes": [
"luau"
],
"name": "luau",
"patterns": [
{
"include": "#function-definition"
},
{
"include": "#number"
},
{
"include": "#string"
},
{
"include": "#shebang"
},
{
"include": "#comment"
},
{
"include": "#local-declaration"
},
{
"include": "#const-declaration"
},
{
"include": "#for-loop"
},
{
"include": "#type-function"
},
{
"include": "#type-alias-declaration"
},
{
"include": "#keyword"
},
{
"include": "#language_constant"
},
{
"include": "#standard_library"
},
{
"include": "#generics-instantiation"
},
{
"include": "#identifier"
},
{
"include": "#operator"
},
{
"include": "#parentheses"
},
{
"include": "#table"
},
{
"include": "#type_cast"
},
{
"include": "#type_annotation"
},
{
"include": "#attribute"
}
],
"repository": {
"attribute": {
"patterns": [
{
"captures": {
"1": {
"name": "keyword.operator.attribute.luau"
},
"2": {
"name": "storage.type.attribute.luau"
}
},
"match": "(@)([A-Z_a-z][0-9A-Z_a-z]*)",
"name": "meta.attribute.luau"
}
]
},
"comment": {
"patterns": [
{
"begin": "--\\[(=*)\\[",
"end": "]\\1]",
"name": "comment.block.luau",
"patterns": [
{
"begin": "(```luau?)\\s*$",
"beginCaptures": {
"1": {
"name": "comment.luau"
}
},
"name": "keyword.operator.other.luau",
"patterns": [
{
"include": "source.luau"
}
],
"while": "^(?!\\s*```)"
},
{
"captures": {
"1": {
"name": "comment.luau"
}
},
"match": "(```)",
"name": "keyword.operator.other.luau"
},
{
"include": "#doc_comment_tags"
}
]
},
{
"begin": "---",
"end": "\\n",
"name": "comment.line.double-dash.documentation.luau",
"patterns": [
{
"include": "#doc_comment_tags"
}
]
},
{
"begin": "--",
"end": "\\n",
"name": "comment.line.double-dash.luau"
}
]
},
"const-declaration": {
"begin": "\\b(const)\\b",
"beginCaptures": {
"1": {
"name": "storage.modifier.const.luau"
}
},
"end": "(?=\\s*[;=]|\\s*$)",
"patterns": [
{
"include": "#comment"
},
{
"include": "#attribute"
},
{
"begin": "(:)",
"beginCaptures": {
"1": {
"name": "keyword.operator.type.luau"
}
},
"end": "(?=\\s*[,;=]|\\s*$)",
"patterns": [
{
"include": "#type_literal"
}
]
},
{
"match": "\\b([A-Z_][0-9A-Z_]*)\\b",
"name": "variable.other.constant.luau"
},
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "variable.other.readwrite.luau"
}
]
},
"doc_comment_tags": {
"patterns": [
{
"match": "@\\w+",
"name": "storage.type.class.luadoc.luau"
},
{
"captures": {
"1": {
"name": "storage.type.class.luadoc.luau"
},
"2": {
"name": "variable.parameter.luau"
}
},
"match": "((?<=[!*/\\s])[@\\\\]param)\\s+\\b(\\w+)\\b"
}
]
},
"for-loop": {
"begin": "\\b(for)\\b",
"beginCaptures": {
"1": {
"name": "keyword.control.luau"
}
},
"end": "\\b(in)\\b|(=)",
"endCaptures": {
"1": {
"name": "keyword.control.luau"
},
"2": {
"name": "keyword.operator.assignment.luau"
}
},
"patterns": [
{
"begin": "(:)",
"beginCaptures": {
"1": {
"name": "keyword.operator.type.luau"
}
},
"end": "(?=\\s*in\\b|\\s*[,=]|\\s*$)",
"patterns": [
{
"include": "#type_literal"
}
]
},
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "variable.parameter.luau"
}
]
},
"function-definition": {
"begin": "\\b(?:(local)\\s+|(const)\\s+)?(function)\\b(?![,:])",
"beginCaptures": {
"1": {
"name": "storage.modifier.local.luau"
},
"2": {
"name": "storage.modifier.const.luau"
},
"3": {
"name": "keyword.control.luau"
}
},
"end": "(?<=[-\\]\"')\\[{}])",
"name": "meta.function.luau",
"patterns": [
{
"include": "#comment"
},
{
"include": "#generics-declaration"
},
{
"begin": "(\\()",
"beginCaptures": {
"1": {
"name": "punctuation.definition.parameters.begin.luau"
}
},
"end": "(\\))",
"endCaptures": {
"1": {
"name": "punctuation.definition.parameters.end.luau"
}
},
"name": "meta.parameter.luau",
"patterns": [
{
"include": "#comment"
},
{
"match": "\\.\\.\\.",
"name": "variable.parameter.function.varargs.luau"
},
{
"match": "[A-Z_a-z][0-9A-Z_a-z]*",
"name": "variable.parameter.function.luau"
},
{
"match": ",",
"name": "punctuation.separator.arguments.luau"
},
{
"begin": ":",
"beginCaptures": {
"0": {
"name": "keyword.operator.type.luau"
}
},
"end": "(?=[),])",
"patterns": [
{
"include": "#type_literal"
}
]
}
]
},
{
"match": "\\b(__(?:add|call|concat|div|eq|index|len??|lt|metatable|mode??|mul|newindex|pow|sub|tostring|unm|iter|idiv))\\b",
"name": "variable.language.metamethod.luau"
},
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "entity.name.function.luau"
}
]
},
"generics-declaration": {
"begin": "(<)",
"end": "(>)",
"patterns": [
{
"match": "[A-Z_a-z][0-9A-Z_a-z]*",
"name": "entity.name.type.luau"
},
{
"match": "=",
"name": "keyword.operator.assignment.luau"
},
{
"include": "#type_literal"
}
]
},
"generics-instantiation": {
"begin": "(<<)",
"beginCaptures": {
"1": {
"name": "punctuation.definition.typeparameters.begin.luau"
}
},
"end": "(>>)",
"endCaptures": {
"1": {
"name": "punctuation.definition.typeparameters.end.luau"
}
},
"patterns": [
{
"include": "#comment"
},
{
"include": "#type_literal"
}
]
},
"identifier": {
"patterns": [
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b(?=\\s*(?:<<|[\"'({]|\\[\\[))",
"name": "entity.name.function.luau"
},
{
"match": "(?<=[^.]\\.|:)\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "variable.other.property.luau"
},
{
"match": "\\b([A-Z_][0-9A-Z_]*)\\b",
"name": "variable.other.constant.luau"
},
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "variable.other.readwrite.luau"
}
]
},
"interpolated_string_expression": {
"begin": "\\{",
"beginCaptures": {
"0": {
"name": "punctuation.definition.interpolated-string-expression.begin.luau"
}
},
"contentName": "meta.embedded.line.luau",
"end": "}",
"endCaptures": {
"0": {
"name": "punctuation.definition.interpolated-string-expression.end.luau"
}
},
"name": "meta.template.expression.luau",
"patterns": [
{
"include": "source.luau"
}
]
},
"keyword": {
"patterns": [
{
"match": "\\b(break|do|else|for|if|elseif|return|then|repeat|while|until|end|in|continue)\\b",
"name": "keyword.control.luau"
},
{
"match": "\\b(local)\\b",
"name": "storage.modifier.local.luau"
},
{
"match": "\\b(const)\\b",
"name": "storage.modifier.const.luau"
},
{
"match": "\\b(function)\\b(?![,:])",
"name": "keyword.control.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(self)\\b",
"name": "variable.language.self.luau"
},
{
"match": "\\b(and|or|not)\\b",
"name": "keyword.operator.logical.luau keyword.operator.wordlike.luau"
},
{
"match": "(?<=[^.]\\.|:)\\b(__(?:add|call|concat|div|eq|index|len??|lt|metatable|mode??|mul|newindex|pow|sub|tostring|unm))\\b",
"name": "variable.language.metamethod.luau"
},
{
"match": "(?<!\\.)\\.{3}(?!\\.)",
"name": "keyword.other.unit.luau"
}
]
},
"language_constant": {
"patterns": [
{
"match": "(?<![^.]\\.|:)\\b(false)\\b",
"name": "constant.language.boolean.false.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(true)\\b",
"name": "constant.language.boolean.true.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(nil(?!:))\\b",
"name": "constant.language.nil.luau"
}
]
},
"local-declaration": {
"begin": "\\b(local)\\b",
"beginCaptures": {
"1": {
"name": "storage.modifier.local.luau"
}
},
"end": "(?=\\s*do\\b|\\s*[;=]|\\s*$)",
"patterns": [
{
"include": "#comment"
},
{
"include": "#attribute"
},
{
"begin": "(:)",
"beginCaptures": {
"1": {
"name": "keyword.operator.type.luau"
}
},
"end": "(?=\\s*do\\b|\\s*[,;=]|\\s*$)",
"patterns": [
{
"include": "#type_literal"
}
]
},
{
"match": "\\b([A-Z_][0-9A-Z_]*)\\b",
"name": "variable.other.constant.luau"
},
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "variable.other.readwrite.luau"
}
]
},
"number": {
"patterns": [
{
"match": "\\b0_*[Xx]_*[A-F_a-f\\d]*(?:[Ee][-+]?_*\\d[_\\d]*(?:\\.[_\\d]*)?)?",
"name": "constant.numeric.hex.luau"
},
{
"match": "\\b0_*[Bb][01_]+(?:[Ee][-+]?_*\\d[_\\d]*(?:\\.[_\\d]*)?)?",
"name": "constant.numeric.binary.luau"
},
{
"match": "(?:\\d[_\\d]*(?:\\.[_\\d]*)?|\\.\\d[_\\d]*)(?:[Ee][-+]?_*\\d[_\\d]*(?:\\.[_\\d]*)?)?",
"name": "constant.numeric.decimal.luau"
}
]
},
"operator": {
"patterns": [
{
"match": "==|~=|!=|<=?|>=?",
"name": "keyword.operator.comparison.luau"
},
{
"match": "(?:[-+]|//??|[%*^]|\\.\\.|)=",
"name": "keyword.operator.assignment.luau"
},
{
"match": "[-%*+]|//|[/^]",
"name": "keyword.operator.arithmetic.luau"
},
{
"match": "#|(?<!\\.)\\.{2}(?!\\.)",
"name": "keyword.operator.other.luau"
}
]
},
"parentheses": {
"begin": "(\\()",
"beginCaptures": {
"1": {
"name": "punctuation.arguments.begin.luau"
}
},
"end": "(\\))",
"endCaptures": {
"1": {
"name": "punctuation.arguments.end.luau"
}
},
"patterns": [
{
"match": ",",
"name": "punctuation.separator.arguments.luau"
},
{
"include": "source.luau"
}
]
},
"shebang": {
"captures": {
"1": {
"name": "punctuation.definition.comment.luau"
}
},
"match": "\\A(#!).*$\\n?",
"name": "comment.line.shebang.luau"
},
"standard_library": {
"patterns": [
{
"match": "(?<![^.]\\.|:)\\b(assert|collectgarbage|error|gcinfo|getfenv|getmetatable|ipairs|loadstring|newproxy|next|pairs|pcall|print|rawequal|rawset|require|select|setfenv|setmetatable|tonumber|tostring|type|typeof|unpack|xpcall)\\b",
"name": "support.function.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(_(?:G|VERSION))\\b",
"name": "constant.language.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(bit32\\.(?:arshift|band|bnot|bor|btest|bxor|extract|lrotate|lshift|replace|rrotate|rshift|countlz|countrz|byteswap)|coroutine\\.(?:create|isyieldable|resume|running|status|wrap|yield|close)|debug\\.(?:info|loadmodule|profilebegin|profileend|traceback)|math\\.(?:abs|acos|asin|atan2??|ceil|clamp|cosh??|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|noise|pow|rad|random|randomseed|round|sign|sinh??|sqrt|tanh??)|os\\.(?:clock|date|difftime|time)|string\\.(?:byte|char|find|format|gmatch|gsub|len|lower|match|pack|packsize|rep|reverse|split|sub|unpack|upper)|table\\.(?:concat|create|find|foreachi??|getn|insert|maxn|move|pack|remove|sort|unpack|clear|freeze|isfrozen|clone)|task\\.(?:spawn|synchronize|desynchronize|wait|defer|delay)|utf8\\.(?:char|codepoint|codes|graphemes|len|nfcnormalize|nfdnormalize|offset)|buffer\\.(?:create|fromstring|tostring|len|readi8|readu8|readi16|readu16|readi32|readu32|readf32|readf64|writei8|writeu8|writei16|writeu16|writei32|writeu32|writef32|writef64|readstring|writestring|copy|fill)|vector\\.(?:abs|angle|ceil|clamp|create|cross|dot|floor|lerp|magnitude|max|min|normalize|sign))\\b",
"name": "support.function.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(bit32|buffer|coroutine|debug|math(\\.(huge|pi))?|os|string|table|task|utf8(\\.charpattern)?|vector(\\.(one|zero))?)\\b",
"name": "support.constant.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(delay|DebuggerManager|elapsedTime|PluginManager|printidentity|settings|spawn|stats|tick|time|UserSettings|version|wait|warn)\\b",
"name": "support.function.luau"
},
{
"match": "(?<![^.]\\.|:)\\b(game|plugin|shared|script|workspace|Enum(?:\\.\\w+){0,2})\\b",
"name": "constant.language.luau"
}
]
},
"string": {
"patterns": [
{
"begin": "\"",
"end": "\"",
"name": "string.quoted.double.luau",
"patterns": [
{
"include": "#string_escape"
}
]
},
{
"begin": "'",
"end": "'",
"name": "string.quoted.single.luau",
"patterns": [
{
"include": "#string_escape"
}
]
},
{
"begin": "\\[(=*)\\[",
"end": "]\\1]",
"name": "string.other.multiline.luau"
},
{
"begin": "`",
"end": "`",
"name": "string.interpolated.luau",
"patterns": [
{
"include": "#interpolated_string_expression"
},
{
"include": "#string_escape"
}
]
}
]
},
"string_escape": {
"patterns": [
{
"match": "\\\\[\"'\\\\`abfnrtvz{]",
"name": "constant.character.escape.luau"
},
{
"match": "\\\\\\d{1,3}",
"name": "constant.character.escape.luau"
},
{
"match": "\\\\x\\h{2}",
"name": "constant.character.escape.luau"
},
{
"match": "\\\\u\\{\\h*}",
"name": "constant.character.escape.luau"
},
{
"match": "\\\\$",
"name": "constant.character.escape.luau"
}
]
},
"table": {
"begin": "(\\{)",
"beginCaptures": {
"1": {
"name": "punctuation.table.begin.luau"
}
},
"end": "(})",
"endCaptures": {
"1": {
"name": "punctuation.table.end.luau"
}
},
"patterns": [
{
"match": "[,;]",
"name": "punctuation.separator.fields.luau"
},
{
"include": "source.luau"
}
]
},
"type-alias-declaration": {
"begin": "(?<![^.]\\.|:)\\b(?:(export)\\s+)?(type)\\b(?=\\s+(?!function\\b)[A-Z_a-z][0-9A-Z_a-z]*)",
"beginCaptures": {
"1": {
"name": "storage.modifier.visibility.luau"
},
"2": {
"name": "storage.type.luau"
}
},
"end": "(?=[]),}](?!\\s*[\\&|]))|(?=\\s*;)|(?=\\s*\\b(?:break|const|continue|do|else|elseif|end|for|function|if|in|local|repeat|return|then|until|while)\\b)|(?=^\\s*$)|(?=^\\s*(?:@|\\b(?:export\\s+)?type\\b))|(?=^\\s*[A-Z_a-z][0-9A-Z_a-z]*(?:\\.[A-Z_a-z][0-9A-Z_a-z]*)*\\s*(?:(?:[-%*+/^]|\\.\\.)?=(?!=)|[(:\\[]))",
"patterns": [
{
"include": "#type_literal"
},
{
"match": "=",
"name": "keyword.operator.assignment.luau"
}
]
},
"type-function": {
"begin": "(?<![^.]\\.|:)\\b(?:(export)\\s+)?(type)\\s+(function)\\b",
"beginCaptures": {
"1": {
"name": "storage.modifier.visibility.luau"
},
"2": {
"name": "storage.type.luau"
},
"3": {
"name": "keyword.control.luau"
}
},
"end": "(?<=[-\\]\"')\\[{}])",
"name": "meta.function.luau",
"patterns": [
{
"include": "#comment"
},
{
"include": "#generics-declaration"
},
{
"begin": "(\\()",
"beginCaptures": {
"1": {
"name": "punctuation.definition.parameters.begin.luau"
}
},
"end": "(\\))",
"endCaptures": {
"1": {
"name": "punctuation.definition.parameters.end.luau"
}
},
"name": "meta.parameter.luau",
"patterns": [
{
"include": "#comment"
},
{
"match": "\\.\\.\\.",
"name": "variable.parameter.function.varargs.luau"
},
{
"match": "[A-Z_a-z][0-9A-Z_a-z]*",
"name": "variable.parameter.function.luau"
},
{
"match": ",",
"name": "punctuation.separator.arguments.luau"
},
{
"begin": ":",
"beginCaptures": {
"0": {
"name": "keyword.operator.type.luau"
}
},
"end": "(?=[),])",
"patterns": [
{
"include": "#type_literal"
}
]
}
]
},
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "entity.name.type.luau"
}
]
},
"type_annotation": {
"begin": ":(?!\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b(?=\\s*(?:<<|[\"'({]|\\[\\[)))",
"end": "(?<=\\))(?!\\s*->)|[;=]|$|(?=\\breturn\\b)|(?=\\bend\\b)",
"patterns": [
{
"include": "#comment"
},
{
"include": "#type_literal"
}
]
},
"type_cast": {
"begin": "(::)",
"beginCaptures": {
"1": {
"name": "keyword.operator.typecast.luau"
}
},
"end": "(?=[]),}](?!\\s*[\\&|]))|(?=\\s*;)|(?=\\s*\\b(?:break|const|continue|do|else|elseif|end|for|function|if|in|local|repeat|return|then|until|while)\\b)|(?=^\\s*$)|(?=^\\s*(?:@|\\b(?:export\\s+)?type\\b))|(?=^\\s*[A-Z_a-z][0-9A-Z_a-z]*(?:\\.[A-Z_a-z][0-9A-Z_a-z]*)*\\s*(?:(?:[-%*+/^]|\\.\\.)?=(?!=)|[(:\\[]))",
"patterns": [
{
"include": "#type_literal"
}
]
},
"type_literal": {
"patterns": [
{
"include": "#comment"
},
{
"include": "#string"
},
{
"match": "[\\&?|]",
"name": "keyword.operator.type.luau"
},
{
"match": "->",
"name": "keyword.operator.type.function.luau"
},
{
"match": "\\b(false)\\b",
"name": "constant.language.boolean.false.luau"
},
{
"match": "\\b(true)\\b",
"name": "constant.language.boolean.true.luau"
},
{
"match": "\\b(nil|string|number|boolean|thread|userdata|symbol|vector|buffer|unknown|never|any)\\b",
"name": "support.type.primitive.luau"
},
{
"begin": "\\b(typeof)\\b(\\()",
"beginCaptures": {
"1": {
"name": "support.function.luau"
},
"2": {
"name": "punctuation.arguments.begin.typeof.luau"
}
},
"end": "(\\))",
"endCaptures": {
"1": {
"name": "punctuation.arguments.end.typeof.luau"
}
},
"patterns": [
{
"include": "source.luau"
}
]
},
{
"begin": "(<)",
"beginCaptures": {
"1": {
"name": "punctuation.definition.typeparameters.begin.luau"
}
},
"end": "(>)",
"endCaptures": {
"1": {
"name": "punctuation.definition.typeparameters.end.luau"
}
},
"patterns": [
{
"match": "=",
"name": "keyword.operator.assignment.luau"
},
{
"include": "#type_literal"
}
]
},
{
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b",
"name": "entity.name.type.luau"
},
{
"begin": "\\{",
"end": "}",
"patterns": [
{
"begin": "\\[",
"end": "]",
"patterns": [
{
"include": "#type_literal"
}
]
},
{
"captures": {
"1": {
"name": "storage.modifier.access.luau"
},
"2": {
"name": "variable.property.luau"
},
"3": {
"name": "keyword.operator.type.luau"
}
},
"match": "\\b(?:(read|write)\\s+)?([A-Z_a-z][0-9A-Z_a-z]*)\\b(:)"
},
{
"include": "#type_literal"
},
{
"match": "[,;]",
"name": "punctuation.separator.fields.type.luau"
}
]
},
{
"begin": "\\(",
"end": "\\)",
"patterns": [
{
"captures": {
"1": {
"name": "variable.parameter.luau"
},
"2": {
"name": "keyword.operator.type.luau"
}
},
"match": "\\b([A-Z_a-z][0-9A-Z_a-z]*)\\b(:)",
"name": "variable.parameter.luau"
},
{
"include": "#type_literal"
}
]
}
]
}
},
"scopeName": "source.luau"
}