@wooorm/starry-night
Version:
Syntax highlighting, like GitHub
721 lines (718 loc) • 28 kB
JavaScript
// This is a TextMate grammar distributed by `starry-night`.
// This grammar is developed at
// <https://github.com/microsoft/typespec>
// and licensed `mit`.
// See <https://github.com/wooorm/starry-night> for more info.
/**
* @import {Grammar} from '@wooorm/starry-night'
*/
/** @type {Grammar} */
const grammar = {
extensions: ['.tsp'],
names: ['typespec', 'tsp'],
patterns: [{include: '#statement'}],
repository: {
'alias-id': {
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)',
name: 'meta.alias-id.typespec',
patterns: [{include: '#expression'}]
},
'alias-statement': {
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)',
name: 'meta.alias-statement.typespec',
patterns: [{include: '#alias-id'}, {include: '#type-parameters'}]
},
'augment-decorator-statement': {
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)',
name: 'meta.augment-decorator-statement.typespec',
patterns: [{include: '#token'}, {include: '#parenthesized-expression'}]
},
'block-comment': {begin: '/\\*', end: '\\*/', name: 'comment.block.tsp'},
'boolean-literal': {
match: '\\b(true|false)\\b',
name: 'constant.language.tsp'
},
callExpression: {
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'}},
name: 'meta.callExpression.typespec',
patterns: [
{include: '#token'},
{include: '#expression'},
{include: '#punctuation-comma'}
]
},
'const-statement': {
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)',
name: 'meta.const-statement.typespec',
patterns: [
{include: '#type-annotation'},
{include: '#operator-assignment'},
{include: '#expression'}
]
},
decorator: {
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)',
name: 'meta.decorator.typespec',
patterns: [{include: '#token'}, {include: '#parenthesized-expression'}]
},
'decorator-declaration-statement': {
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)',
name: 'meta.decorator-declaration-statement.typespec',
patterns: [{include: '#token'}, {include: '#operation-parameters'}]
},
directive: {
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)',
name: 'meta.directive.typespec',
patterns: [
{include: '#string-literal'},
{include: '#identifier-expression'}
]
},
'doc-comment': {
begin: '/\\*\\*',
beginCaptures: {0: {name: 'comment.block.tsp'}},
end: '\\*/',
endCaptures: {0: {name: 'comment.block.tsp'}},
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': {
captures: {
1: {name: 'keyword.tag.tspdoc'},
2: {name: 'keyword.tag.tspdoc'},
3: {name: 'variable.name.tsp'}
},
match:
'(?x)((@)(?:param|template|prop))\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\b',
name: 'comment.block.tsp'
},
'doc-comment-return-tag': {
captures: {
1: {name: 'keyword.tag.tspdoc'},
2: {name: 'keyword.tag.tspdoc'}
},
match: '(?x)((@)(?:returns))\\b',
name: 'comment.block.tsp'
},
'doc-comment-unknown-tag': {
captures: {
1: {name: 'entity.name.tag.tsp'},
2: {name: 'entity.name.tag.tsp'}
},
match:
'(?x)((@)(?:\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`))\\b',
name: 'comment.block.tsp'
},
'enum-body': {
begin: '\\{',
beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
end: '\\}',
endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
name: 'meta.enum-body.typespec',
patterns: [
{include: '#enum-member'},
{include: '#token'},
{include: '#directive'},
{include: '#decorator'},
{include: '#punctuation-comma'}
]
},
'enum-member': {
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)',
name: 'meta.enum-member.typespec',
patterns: [{include: '#token'}, {include: '#type-annotation'}]
},
'enum-statement': {
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)',
name: 'meta.enum-statement.typespec',
patterns: [{include: '#token'}, {include: '#enum-body'}]
},
'escape-character': {match: '\\\\.', name: 'constant.character.escape.tsp'},
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': {
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)',
name: 'meta.function-declaration-statement.typespec',
patterns: [
{include: '#token'},
{include: '#operation-parameters'},
{include: '#type-annotation'}
]
},
'identifier-expression': {
match: '\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`',
name: 'entity.name.type.tsp'
},
'import-statement': {
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)',
name: 'meta.import-statement.typespec',
patterns: [{include: '#token'}]
},
'interface-body': {
begin: '\\{',
beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
end: '\\}',
endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
name: 'meta.interface-body.typespec',
patterns: [
{include: '#token'},
{include: '#directive'},
{include: '#decorator'},
{include: '#interface-member'},
{include: '#punctuation-semicolon'}
]
},
'interface-heritage': {
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))',
name: 'meta.interface-heritage.typespec',
patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
},
'interface-member': {
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)',
name: 'meta.interface-member.typespec',
patterns: [{include: '#token'}, {include: '#operation-signature'}]
},
'interface-statement': {
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)',
name: 'meta.interface-statement.typespec',
patterns: [
{include: '#token'},
{include: '#type-parameters'},
{include: '#interface-heritage'},
{include: '#interface-body'},
{include: '#expression'}
]
},
'line-comment': {match: '//.*$', name: 'comment.line.double-slash.tsp'},
'model-expression': {
begin: '\\{',
beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
end: '\\}',
endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
name: 'meta.model-expression.typespec',
patterns: [
{include: '#model-property'},
{include: '#token'},
{include: '#directive'},
{include: '#decorator'},
{include: '#spread-operator'},
{include: '#punctuation-semicolon'}
]
},
'model-heritage': {
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))',
name: 'meta.model-heritage.typespec',
patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
},
'model-property': {
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)',
name: 'meta.model-property.typespec',
patterns: [
{include: '#token'},
{include: '#type-annotation'},
{include: '#operator-assignment'},
{include: '#expression'}
]
},
'model-statement': {
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)',
name: 'meta.model-statement.typespec',
patterns: [
{include: '#token'},
{include: '#type-parameters'},
{include: '#model-heritage'},
{include: '#expression'}
]
},
'namespace-body': {
begin: '\\{',
beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
end: '\\}',
endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
name: 'meta.namespace-body.typespec',
patterns: [{include: '#statement'}]
},
'namespace-name': {
begin: '(?=([_$[:alpha:]]|`))',
end: '((?=\\{)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))',
name: 'meta.namespace-name.typespec',
patterns: [
{include: '#identifier-expression'},
{include: '#punctuation-accessor'}
]
},
'namespace-statement': {
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))',
name: 'meta.namespace-statement.typespec',
patterns: [
{include: '#token'},
{include: '#namespace-name'},
{include: '#namespace-body'}
]
},
'numeric-literal': {
match:
'(?:\\b(?<!\\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\\b(?!\\$)|\\b(?<!\\$)0(?:b|B)[01][01_]*(n)?\\b(?!\\$)|(?<!\\$)(?:(?:\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(\\.)[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\B(\\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(\\.)(n)?\\B)|(?:\\B(\\.)[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(n)?\\b(?!\\.)))(?!\\$))',
name: 'constant.numeric.tsp'
},
'object-literal': {
begin: '#\\{',
beginCaptures: {0: {name: 'punctuation.hashcurlybrace.open.tsp'}},
end: '\\}',
endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
name: 'meta.object-literal.typespec',
patterns: [
{include: '#token'},
{include: '#object-literal-property'},
{include: '#directive'},
{include: '#spread-operator'},
{include: '#punctuation-comma'}
]
},
'object-literal-property': {
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)',
name: 'meta.object-literal-property.typespec',
patterns: [{include: '#token'}, {include: '#expression'}]
},
'operation-heritage': {
begin: '\\b(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)',
name: 'meta.operation-heritage.typespec',
patterns: [{include: '#expression'}]
},
'operation-parameters': {
begin: '\\(',
beginCaptures: {0: {name: 'punctuation.parenthesis.open.tsp'}},
end: '\\)',
endCaptures: {0: {name: 'punctuation.parenthesis.close.tsp'}},
name: 'meta.operation-parameters.typespec',
patterns: [
{include: '#token'},
{include: '#decorator'},
{include: '#model-property'},
{include: '#spread-operator'},
{include: '#punctuation-comma'}
]
},
'operation-signature': {
patterns: [
{include: '#type-parameters'},
{include: '#operation-heritage'},
{include: '#operation-parameters'},
{include: '#type-annotation'}
]
},
'operation-statement': {
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)',
name: 'meta.operation-statement.typespec',
patterns: [{include: '#token'}, {include: '#operation-signature'}]
},
'operator-assignment': {
match: '=',
name: 'keyword.operator.assignment.tsp'
},
'parenthesized-expression': {
begin: '\\(',
beginCaptures: {0: {name: 'punctuation.parenthesis.open.tsp'}},
end: '\\)',
endCaptures: {0: {name: 'punctuation.parenthesis.close.tsp'}},
name: 'meta.parenthesized-expression.typespec',
patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
},
'punctuation-accessor': {match: '\\.', name: 'punctuation.accessor.tsp'},
'punctuation-comma': {match: ',', name: 'punctuation.comma.tsp'},
'punctuation-semicolon': {
match: ';',
name: 'punctuation.terminator.statement.tsp'
},
'scalar-body': {
begin: '\\{',
beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
end: '\\}',
endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
name: 'meta.scalar-body.typespec',
patterns: [
{include: '#token'},
{include: '#directive'},
{include: '#scalar-constructor'},
{include: '#punctuation-semicolon'}
]
},
'scalar-constructor': {
begin:
'\\b(init)\\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)',
name: 'meta.scalar-constructor.typespec',
patterns: [{include: '#token'}, {include: '#operation-parameters'}]
},
'scalar-extends': {
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)',
name: 'meta.scalar-extends.typespec',
patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
},
'scalar-statement': {
begin:
'\\b(scalar)\\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)',
name: 'meta.scalar-statement.typespec',
patterns: [
{include: '#token'},
{include: '#type-parameters'},
{include: '#scalar-extends'},
{include: '#scalar-body'}
]
},
'spread-operator': {
begin: '\\.\\.\\.',
beginCaptures: {0: {name: 'keyword.operator.spread.tsp'}},
end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
name: 'meta.spread-operator.typespec',
patterns: [{include: '#expression'}]
},
statement: {
patterns: [
{include: '#token'},
{include: '#directive'},
{include: '#augment-decorator-statement'},
{include: '#decorator'},
{include: '#model-statement'},
{include: '#scalar-statement'},
{include: '#union-statement'},
{include: '#interface-statement'},
{include: '#enum-statement'},
{include: '#alias-statement'},
{include: '#const-statement'},
{include: '#namespace-statement'},
{include: '#operation-statement'},
{include: '#import-statement'},
{include: '#using-statement'},
{include: '#decorator-declaration-statement'},
{include: '#function-declaration-statement'},
{include: '#punctuation-semicolon'}
]
},
'string-literal': {
begin: '"',
end: '"|$',
name: 'string.quoted.double.tsp',
patterns: [
{include: '#template-expression'},
{include: '#escape-character'}
]
},
'template-expression': {
begin: '\\$\\{',
beginCaptures: {
0: {name: 'punctuation.definition.template-expression.begin.tsp'}
},
end: '\\}',
endCaptures: {
0: {name: 'punctuation.definition.template-expression.end.tsp'}
},
name: 'meta.template-expression.typespec',
patterns: [{include: '#expression'}]
},
token: {
patterns: [
{include: '#doc-comment'},
{include: '#line-comment'},
{include: '#block-comment'},
{include: '#triple-quoted-string-literal'},
{include: '#string-literal'},
{include: '#boolean-literal'},
{include: '#numeric-literal'}
]
},
'triple-quoted-string-literal': {
begin: '"""',
end: '"""',
name: 'string.quoted.triple.tsp',
patterns: [
{include: '#template-expression'},
{include: '#escape-character'}
]
},
'tuple-expression': {
begin: '\\[',
beginCaptures: {0: {name: 'punctuation.squarebracket.open.tsp'}},
end: '\\]',
endCaptures: {0: {name: 'punctuation.squarebracket.close.tsp'}},
name: 'meta.tuple-expression.typespec',
patterns: [{include: '#expression'}]
},
'tuple-literal': {
begin: '#\\[',
beginCaptures: {0: {name: 'punctuation.hashsquarebracket.open.tsp'}},
end: '\\]',
endCaptures: {0: {name: 'punctuation.squarebracket.close.tsp'}},
name: 'meta.tuple-literal.typespec',
patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
},
'type-annotation': {
begin: '\\s*(\\??)\\s*(:)',
beginCaptures: {
1: {name: 'keyword.operator.optional.tsp'},
2: {name: 'keyword.operator.type.annotation.tsp'}
},
end: '(?=,|;|@|\\)|\\}|=|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
name: 'meta.type-annotation.typespec',
patterns: [{include: '#expression'}]
},
'type-argument': {
begin:
'(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*(=))',
beginCaptures: {
1: {name: 'entity.name.type.tsp'},
2: {name: 'keyword.operator.assignment.tsp'}
},
end: '(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
endCaptures: {0: {name: 'keyword.operator.assignment.tsp'}},
name: 'meta.type-argument.typespec',
patterns: [
{include: '#token'},
{include: '#expression'},
{include: '#punctuation-comma'}
]
},
'type-arguments': {
begin: '<',
beginCaptures: {
0: {name: 'punctuation.definition.typeparameters.begin.tsp'}
},
end: '>',
endCaptures: {0: {name: 'punctuation.definition.typeparameters.end.tsp'}},
name: 'meta.type-arguments.typespec',
patterns: [
{include: '#type-argument'},
{include: '#expression'},
{include: '#punctuation-comma'}
]
},
'type-parameter': {
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)',
name: 'meta.type-parameter.typespec',
patterns: [
{include: '#token'},
{include: '#type-parameter-constraint'},
{include: '#type-parameter-default'}
]
},
'type-parameter-constraint': {
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)',
name: 'meta.type-parameter-constraint.typespec',
patterns: [{include: '#expression'}]
},
'type-parameter-default': {
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)',
name: 'meta.type-parameter-default.typespec',
patterns: [{include: '#expression'}]
},
'type-parameters': {
begin: '<',
beginCaptures: {
0: {name: 'punctuation.definition.typeparameters.begin.tsp'}
},
end: '>',
endCaptures: {0: {name: 'punctuation.definition.typeparameters.end.tsp'}},
name: 'meta.type-parameters.typespec',
patterns: [{include: '#type-parameter'}, {include: '#punctuation-comma'}]
},
typeof: {
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)',
name: 'meta.typeof.typespec',
patterns: [{include: '#expression'}]
},
'union-body': {
begin: '\\{',
beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
end: '\\}',
endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
name: 'meta.union-body.typespec',
patterns: [
{include: '#union-variant'},
{include: '#token'},
{include: '#directive'},
{include: '#decorator'},
{include: '#expression'},
{include: '#punctuation-comma'}
]
},
'union-statement': {
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)',
name: 'meta.union-statement.typespec',
patterns: [{include: '#token'}, {include: '#union-body'}]
},
'union-variant': {
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)',
name: 'meta.union-variant.typespec',
patterns: [{include: '#token'}, {include: '#expression'}]
},
'using-statement': {
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)',
name: 'meta.using-statement.typespec',
patterns: [
{include: '#token'},
{include: '#identifier-expression'},
{include: '#punctuation-accessor'}
]
},
valueof: {
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)',
name: 'meta.valueof.typespec',
patterns: [{include: '#expression'}]
}
},
scopeName: 'source.tsp'
}
export default grammar