{ "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", "name": "TypeSpec", "scopeName": "source.tsp", "fileTypes": [ "tsp" ], "patterns": [ { "include": "#statement" } ], "repository": { "alias-id": { "name": "meta.alias-id.typespec", "begin": "(=)\\s*", "beginCaptures": { "1": { "name": "keyword.operator.assignment.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#expression" } ] }, "alias-statement": { "name": "meta.alias-statement.typespec", "begin": "\\b(alias)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*", "beginCaptures": { "1": { "name": "keyword.other.tsp" }, "2": { "name": "entity.name.type.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#alias-id" }, { "include": "#type-parameters" } ] }, "augment-decorator-statement": { "name": "meta.augment-decorator-statement.typespec", "begin": "((@@)\\b[_$[:alpha:]](?:[_$[:alnum:]]|\\.[_$[:alpha:]])*\\b)", "beginCaptures": { "1": { "name": "entity.name.tag.tsp" }, "2": { "name": "entity.name.tag.tsp" } }, "end": "(?=([_$[:alpha:]]|`))|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#parenthesized-expression" } ] }, "block-comment": { "name": "comment.block.tsp", "begin": "/\\*", "end": "\\*/" }, "boolean-literal": { "name": "constant.language.tsp", "match": "\\b(true|false)\\b" }, "callExpression": { "name": "meta.callExpression.typespec", "begin": "(\\b[_$[:alpha:]](?:[_$[:alnum:]]|\\.[_$[:alpha:]])*\\b)\\s*(\\()", "beginCaptures": { "1": { "name": "entity.name.function.tsp" }, "2": { "name": "punctuation.parenthesis.open.tsp" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.parenthesis.close.tsp" } }, "patterns": [ { "include": "#token" }, { "include": "#expression" }, { "include": "#punctuation-comma" } ] }, "const-statement": { "name": "meta.const-statement.typespec", "begin": "\\b(const)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)", "beginCaptures": { "1": { "name": "keyword.other.tsp" }, "2": { "name": "variable.name.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#type-annotation" }, { "include": "#operator-assignment" }, { "include": "#expression" } ] }, "decorator": { "name": "meta.decorator.typespec", "begin": "((@)\\b[_$[:alpha:]](?:[_$[:alnum:]]|\\.[_$[:alpha:]])*\\b)", "beginCaptures": { "1": { "name": "entity.name.tag.tsp" }, "2": { "name": "entity.name.tag.tsp" } }, "end": "(?=([_$[:alpha:]]|`))|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#parenthesized-expression" } ] }, "decorator-declaration-statement": { "name": "meta.decorator-declaration-statement.typespec", "begin": "(?:(extern)\\s+)?\\b(dec)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)", "beginCaptures": { "1": { "name": "keyword.other.tsp" }, "2": { "name": "keyword.other.tsp" }, "3": { "name": "entity.name.function.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#operation-parameters" } ] }, "directive": { "name": "meta.directive.typespec", "begin": "\\s*(#\\b[_$[:alpha:]][_$[:alnum:]]*\\b)", "beginCaptures": { "1": { "name": "keyword.directive.name.tsp" } }, "end": "$|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#string-literal" }, { "include": "#identifier-expression" } ] }, "doc-comment": { "name": "comment.block.tsp", "begin": "/\\*\\*", "beginCaptures": { "0": { "name": "comment.block.tsp" } }, "end": "\\*/", "endCaptures": { "0": { "name": "comment.block.tsp" } }, "patterns": [ { "include": "#doc-comment-block" } ] }, "doc-comment-block": { "patterns": [ { "include": "#doc-comment-param" }, { "include": "#doc-comment-return-tag" }, { "include": "#doc-comment-unknown-tag" } ] }, "doc-comment-param": { "name": "comment.block.tsp", "match": "(?x)((@)(?:param|template|prop))\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\b", "captures": { "1": { "name": "keyword.tag.tspdoc" }, "2": { "name": "keyword.tag.tspdoc" }, "3": { "name": "variable.name.tsp" } } }, "doc-comment-return-tag": { "name": "comment.block.tsp", "match": "(?x)((@)(?:returns))\\b", "captures": { "1": { "name": "keyword.tag.tspdoc" }, "2": { "name": "keyword.tag.tspdoc" } } }, "doc-comment-unknown-tag": { "name": "comment.block.tsp", "match": "(?x)((@)(?:\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`))\\b", "captures": { "1": { "name": "entity.name.tag.tsp" }, "2": { "name": "entity.name.tag.tsp" } } }, "enum-body": { "name": "meta.enum-body.typespec", "begin": "\\{", "beginCaptures": { "0": { "name": "punctuation.curlybrace.open.tsp" } }, "end": "\\}", "endCaptures": { "0": { "name": "punctuation.curlybrace.close.tsp" } }, "patterns": [ { "include": "#enum-member" }, { "include": "#token" }, { "include": "#directive" }, { "include": "#decorator" }, { "include": "#punctuation-comma" } ] }, "enum-member": { "name": "meta.enum-member.typespec", "begin": "(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*(:?))", "beginCaptures": { "1": { "name": "variable.name.tsp" }, "2": { "name": "keyword.operator.type.annotation.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#type-annotation" } ] }, "enum-statement": { "name": "meta.enum-statement.typespec", "begin": "\\b(enum)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)", "beginCaptures": { "1": { "name": "keyword.other.tsp" }, "2": { "name": "entity.name.type.tsp" } }, "end": "(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#enum-body" } ] }, "escape-character": { "name": "constant.character.escape.tsp", "match": "\\\\." }, "expression": { "patterns": [ { "include": "#token" }, { "include": "#directive" }, { "include": "#parenthesized-expression" }, { "include": "#valueof" }, { "include": "#typeof" }, { "include": "#type-arguments" }, { "include": "#object-literal" }, { "include": "#tuple-literal" }, { "include": "#tuple-expression" }, { "include": "#model-expression" }, { "include": "#callExpression" }, { "include": "#identifier-expression" } ] }, "function-declaration-statement": { "name": "meta.function-declaration-statement.typespec", "begin": "(?:(extern)\\s+)?\\b(fn)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)", "beginCaptures": { "1": { "name": "keyword.other.tsp" }, "2": { "name": "keyword.other.tsp" }, "3": { "name": "entity.name.function.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#operation-parameters" }, { "include": "#type-annotation" } ] }, "identifier-expression": { "name": "entity.name.type.tsp", "match": "\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`" }, "import-statement": { "name": "meta.import-statement.typespec", "begin": "\\b(import)\\b", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" } ] }, "interface-body": { "name": "meta.interface-body.typespec", "begin": "\\{", "beginCaptures": { "0": { "name": "punctuation.curlybrace.open.tsp" } }, "end": "\\}", "endCaptures": { "0": { "name": "punctuation.curlybrace.close.tsp" } }, "patterns": [ { "include": "#token" }, { "include": "#directive" }, { "include": "#decorator" }, { "include": "#interface-member" }, { "include": "#punctuation-semicolon" } ] }, "interface-heritage": { "name": "meta.interface-heritage.typespec", "begin": "\\b(extends)\\b", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "((?=\\{)|(?=;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))", "patterns": [ { "include": "#expression" }, { "include": "#punctuation-comma" } ] }, "interface-member": { "name": "meta.interface-member.typespec", "begin": "(?:\\b(op)\\b\\s+)?(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)", "beginCaptures": { "1": { "name": "keyword.other.tsp" }, "2": { "name": "entity.name.function.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#operation-signature" } ] }, "interface-statement": { "name": "meta.interface-statement.typespec", "begin": "\\b(interface)\\b", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#type-parameters" }, { "include": "#interface-heritage" }, { "include": "#interface-body" }, { "include": "#expression" } ] }, "line-comment": { "name": "comment.line.double-slash.tsp", "match": "//.*$" }, "model-expression": { "name": "meta.model-expression.typespec", "begin": "\\{", "beginCaptures": { "0": { "name": "punctuation.curlybrace.open.tsp" } }, "end": "\\}", "endCaptures": { "0": { "name": "punctuation.curlybrace.close.tsp" } }, "patterns": [ { "include": "#model-property" }, { "include": "#token" }, { "include": "#directive" }, { "include": "#decorator" }, { "include": "#spread-operator" }, { "include": "#punctuation-semicolon" } ] }, "model-heritage": { "name": "meta.model-heritage.typespec", "begin": "\\b(extends|is)\\b", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "((?=\\{)|(?=;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))", "patterns": [ { "include": "#expression" }, { "include": "#punctuation-comma" } ] }, "model-property": { "name": "meta.model-property.typespec", "begin": "(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)|(\\\"(?:[^\\\"\\\\]|\\\\.)*\\\"))", "beginCaptures": { "1": { "name": "variable.name.tsp" }, "2": { "name": "string.quoted.double.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#type-annotation" }, { "include": "#operator-assignment" }, { "include": "#expression" } ] }, "model-statement": { "name": "meta.model-statement.typespec", "begin": "\\b(model)\\b", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#type-parameters" }, { "include": "#model-heritage" }, { "include": "#expression" } ] }, "namespace-body": { "name": "meta.namespace-body.typespec", "begin": "\\{", "beginCaptures": { "0": { "name": "punctuation.curlybrace.open.tsp" } }, "end": "\\}", "endCaptures": { "0": { "name": "punctuation.curlybrace.close.tsp" } }, "patterns": [ { "include": "#statement" } ] }, "namespace-name": { "name": "meta.namespace-name.typespec", "begin": "(?=([_$[:alpha:]]|`))", "end": "((?=\\{)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))", "patterns": [ { "include": "#identifier-expression" }, { "include": "#punctuation-accessor" } ] }, "namespace-statement": { "name": "meta.namespace-statement.typespec", "begin": "\\b(namespace)\\b", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "((?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))", "patterns": [ { "include": "#token" }, { "include": "#namespace-name" }, { "include": "#namespace-body" } ] }, "numeric-literal": { "name": "constant.numeric.tsp", "match": "(?:\\b(?)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "endCaptures": { "0": { "name": "keyword.operator.assignment.tsp" } }, "patterns": [ { "include": "#token" }, { "include": "#expression" }, { "include": "#punctuation-comma" } ] }, "type-arguments": { "name": "meta.type-arguments.typespec", "begin": "<", "beginCaptures": { "0": { "name": "punctuation.definition.typeparameters.begin.tsp" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.definition.typeparameters.end.tsp" } }, "patterns": [ { "include": "#type-argument" }, { "include": "#expression" }, { "include": "#punctuation-comma" } ] }, "type-parameter": { "name": "meta.type-parameter.typespec", "begin": "(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)", "beginCaptures": { "1": { "name": "entity.name.type.tsp" } }, "end": "(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#type-parameter-constraint" }, { "include": "#type-parameter-default" } ] }, "type-parameter-constraint": { "name": "meta.type-parameter-constraint.typespec", "begin": "extends", "beginCaptures": { "0": { "name": "keyword.other.tsp" } }, "end": "(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#expression" } ] }, "type-parameter-default": { "name": "meta.type-parameter-default.typespec", "begin": "=", "beginCaptures": { "0": { "name": "keyword.operator.assignment.tsp" } }, "end": "(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#expression" } ] }, "type-parameters": { "name": "meta.type-parameters.typespec", "begin": "<", "beginCaptures": { "0": { "name": "punctuation.definition.typeparameters.begin.tsp" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.definition.typeparameters.end.tsp" } }, "patterns": [ { "include": "#type-parameter" }, { "include": "#punctuation-comma" } ] }, "typeof": { "name": "meta.typeof.typespec", "begin": "\\b(typeof)", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#expression" } ] }, "union-body": { "name": "meta.union-body.typespec", "begin": "\\{", "beginCaptures": { "0": { "name": "punctuation.curlybrace.open.tsp" } }, "end": "\\}", "endCaptures": { "0": { "name": "punctuation.curlybrace.close.tsp" } }, "patterns": [ { "include": "#union-variant" }, { "include": "#token" }, { "include": "#directive" }, { "include": "#decorator" }, { "include": "#expression" }, { "include": "#punctuation-comma" } ] }, "union-statement": { "name": "meta.union-statement.typespec", "begin": "\\b(union)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)", "beginCaptures": { "1": { "name": "keyword.other.tsp" }, "2": { "name": "entity.name.type.tsp" } }, "end": "(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#union-body" } ] }, "union-variant": { "name": "meta.union-variant.typespec", "begin": "(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*(:))", "beginCaptures": { "1": { "name": "variable.name.tsp" }, "2": { "name": "keyword.operator.type.annotation.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#expression" } ] }, "using-statement": { "name": "meta.using-statement.typespec", "begin": "\\b(using)\\b", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#token" }, { "include": "#identifier-expression" }, { "include": "#punctuation-accessor" } ] }, "valueof": { "name": "meta.valueof.typespec", "begin": "\\b(valueof)", "beginCaptures": { "1": { "name": "keyword.other.tsp" } }, "end": "(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)", "patterns": [ { "include": "#expression" } ] } } }