// This is a TextMate grammar distributed by `starry-night`. // This grammar is developed at // // and licensed `mit`. // See for more info. /** * @import {Grammar} from '@wooorm/starry-night' */ /** @type {Grammar} */ const grammar = { extensions: ['.luau'], names: ['luau'], patterns: [ {include: '#function-definition'}, {include: '#number'}, {include: '#string'}, {include: '#shebang'}, {include: '#comment'}, {include: '#local-declaration'}, {include: '#for-loop'}, {include: '#type-function'}, {include: '#type-alias-declaration'}, {include: '#keyword'}, {include: '#language_constant'}, {include: '#standard_library'}, {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-zA-Z_][a-zA-Z0-9_]*)', name: 'meta.attribute.luau' } ] }, comment: { patterns: [ { begin: '--\\[(=*)\\[', end: '\\]\\1\\]', name: 'comment.block.luau', patterns: [ { begin: '(```luau?)\\s+', beginCaptures: {1: {name: 'comment.luau'}}, end: '(```)', endCaptures: {1: {name: 'comment.luau'}}, name: 'keyword.operator.other.luau', patterns: [{include: 'source.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'} ] }, 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-zA-Z_][a-zA-Z0-9_]*)\\b', name: 'variable.parameter.luau' } ] }, 'function-definition': { begin: '\\b(?:(local)\\s+)?(function)\\b(?![,:])', beginCaptures: { 1: {name: 'storage.modifier.local.luau'}, 2: {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-zA-Z_][a-zA-Z0-9_]*', 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|__le|__len|__lt|__metatable|__mod|__mode|__mul|__newindex|__pow|__sub|__tostring|__unm|__iter|__idiv)\\b', name: 'variable.language.metamethod.luau' }, { match: '\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b', name: 'entity.name.function.luau' } ] }, 'generics-declaration': { begin: '(<)', end: '(>)', patterns: [ {match: '[a-zA-Z_][a-zA-Z0-9_]*', name: 'entity.name.type.luau'}, {match: '=', name: 'keyword.operator.assignment.luau'}, {include: '#type_literal'} ] }, identifier: { patterns: [ { match: '\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b(?=\\s*(?:[({"\']|\\[\\[))', name: 'entity.name.function.luau' }, { match: '(?<=[^.]\\.|:)\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b', name: 'variable.other.property.luau' }, { match: '\\b([A-Z_][A-Z0-9_]*)\\b', name: 'variable.other.constant.luau' }, { match: '\\b([a-zA-Z_][a-zA-Z0-9_]*)\\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(function)\\b(?![,:])', name: 'keyword.control.luau'}, { match: '(?=?', name: 'keyword.operator.comparison.luau'}, { match: '\\+=|-=|/=|//=|\\*=|%=|\\^=|\\.\\.=|=', name: 'keyword.operator.assignment.luau' }, { match: '\\+|-|%|\\*|\\/\\/|\\/|\\^', name: 'keyword.operator.arithmetic.luau' }, {match: '#|(?)|=|;|$|(?=\\breturn\\b)|(?=\\bend\\b)', patterns: [{include: '#comment'}, {include: '#type_literal'}] }, type_cast: { begin: '(::)', beginCaptures: {1: {name: 'keyword.operator.typecast.luau'}}, end: '(?=^|[;),}\\]:?\\-\\+\\>](?!\\s*[&\\|])|$|\\b(break|do|else|for|if|elseif|return|then|repeat|while|until|end|in|continue)\\b)', 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-zA-Z_][a-zA-Z0-9_]*)\\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-zA-Z_][a-zA-Z0-9_]*)\\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-zA-Z_][a-zA-Z0-9_]*)\\b(:)', name: 'variable.parameter.luau' }, {include: '#type_literal'} ] } ] } }, scopeName: 'source.luau' } export default grammar