{
"injectionSelector": "L:text.html -comment",
"name": "angular-expression",
"patterns": [
{
"include": "#ngExpression"
}
],
"repository": {
"arrayLiteral": {
"begin": "\\[",
"beginCaptures": {
"0": {
"name": "meta.brace.square.ts"
}
},
"end": "]",
"endCaptures": {
"0": {
"name": "meta.brace.square.ts"
}
},
"name": "meta.array.literal.ts",
"patterns": [
{
"include": "#ngExpression"
},
{
"include": "#punctuationComma"
}
]
},
"booleanLiteral": {
"patterns": [
{
"match": "(?>>??|\\|)=",
"name": "keyword.operator.assignment.compound.bitwise.ts"
},
{
"match": "<<|>>>?",
"name": "keyword.operator.bitwise.shift.ts"
},
{
"match": "[!=]==?",
"name": "keyword.operator.comparison.ts"
},
{
"match": "<=|>=|<>|[<>]",
"name": "keyword.operator.relational.ts"
},
{
"match": "!|&&|\\?\\?|\\|\\|",
"name": "keyword.operator.logical.ts"
},
{
"match": "[\\&^|~]",
"name": "keyword.operator.bitwise.ts"
},
{
"match": "=",
"name": "keyword.operator.assignment.ts"
},
{
"match": "--",
"name": "keyword.operator.decrement.ts"
},
{
"match": "\\+\\+",
"name": "keyword.operator.increment.ts"
},
{
"match": "[-%*+/]",
"name": "keyword.operator.arithmetic.ts"
},
{
"captures": {
"1": {
"name": "keyword.operator.arithmetic.ts"
}
},
"match": "(?<=[$_[:alnum:]])\\s*(/)(?![*/])"
},
{
"include": "#typeofOperator"
}
]
},
"functionCall": {
"begin": "(?=(\\??\\.\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\s*(<([^<>]|<[^<>]+>)+>\\s*)?\\()",
"end": "(?<=\\))(?!(\\??\\.\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\s*(<([^<>]|<[^<>]+>)+>\\s*)?\\()",
"patterns": [
{
"match": "\\?",
"name": "punctuation.accessor.ts"
},
{
"match": "\\.",
"name": "punctuation.accessor.ts"
},
{
"match": "([$_[:alpha:]][$_[:alnum:]]*)",
"name": "entity.name.function.ts"
},
{
"begin": "<",
"beginCaptures": {
"0": {
"name": "punctuation.definition.typeparameters.begin.ts"
}
},
"end": ">",
"endCaptures": {
"0": {
"name": "punctuation.definition.typeparameters.end.ts"
}
},
"name": "meta.type.parameters.ts",
"patterns": [
{
"include": "#type"
},
{
"include": "#punctuationComma"
}
]
},
{
"include": "#parenExpression"
}
]
},
"functionParameters": {
"begin": "\\(",
"beginCaptures": {
"0": {
"name": "punctuation.definition.parameters.begin.ts"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.parameters.end.ts"
}
},
"name": "meta.parameters.ts",
"patterns": [
{
"include": "#decorator"
},
{
"include": "#parameterName"
},
{
"include": "#variableInitializer"
},
{
"match": ",",
"name": "punctuation.separator.parameter.ts"
}
]
},
"identifiers": {
"patterns": [
{
"match": "([$_[:alpha:]][$_[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))",
"name": "support.class.ts"
},
{
"captures": {
"1": {
"name": "punctuation.accessor.ts"
},
"2": {
"name": "constant.other.object.property.ts"
},
"3": {
"name": "variable.other.object.property.ts"
}
},
"match": "([!?]?\\.)\\s*(?:(\\p{upper}[$_\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\s*\\.\\s*[$_[:alpha:]][$_[:alnum:]]*)"
},
{
"captures": {
"1": {
"name": "punctuation.accessor.ts"
},
"2": {
"name": "entity.name.function.ts"
}
},
"match": "(?:([!?]?\\.)\\s*)?([$_[:alpha:]][$_[:alnum:]]*)(?=\\s*=\\s*((async\\s+)|(function\\s*[(<])|(function\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\s*=>)|((<([^<>]|<[^<>]+>)+>\\s*)?\\(([^()]|\\([^()]*\\))*\\)(\\s*:\\s*(.)*)?\\s*=>)))"
},
{
"captures": {
"1": {
"name": "punctuation.accessor.ts"
},
"2": {
"name": "constant.other.property.ts"
}
},
"match": "([!?]?\\.)\\s*(\\p{upper}[$_\\d[:upper:]]*)(?![$_[:alnum:]])"
},
{
"captures": {
"1": {
"name": "punctuation.accessor.ts"
},
"2": {
"name": "variable.other.property.ts"
}
},
"match": "([!?]?\\.)\\s*([$_[:alpha:]][$_[:alnum:]]*)"
},
{
"captures": {
"1": {
"name": "constant.other.object.ts"
},
"2": {
"name": "variable.other.object.ts"
}
},
"match": "(?:(\\p{upper}[$_\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\s*\\.\\s*[$_[:alpha:]][$_[:alnum:]]*)"
},
{
"match": "(\\p{upper}[$_\\d[:upper:]]*)(?![$_[:alnum:]])",
"name": "constant.character.other"
},
{
"match": "[$_[:alpha:]][$_[:alnum:]]*",
"name": "variable.other.readwrite.ts"
}
]
},
"literal": {
"name": "literal.ts",
"patterns": [
{
"include": "#numericLiteral"
},
{
"include": "#booleanLiteral"
},
{
"include": "#nullLiteral"
},
{
"include": "#undefinedLiteral"
},
{
"include": "#numericConstantLiteral"
},
{
"include": "#arrayLiteral"
},
{
"include": "#thisLiteral"
}
]
},
"ngExpression": {
"name": "meta.expression.ng",
"patterns": [
{
"include": "#string"
},
{
"include": "#literal"
},
{
"include": "#ternaryExpression"
},
{
"include": "#expressionOperator"
},
{
"include": "#functionCall"
},
{
"include": "#identifiers"
},
{
"include": "#parenExpression"
},
{
"include": "#punctuationComma"
},
{
"include": "#punctuationSemicolon"
},
{
"include": "#punctuationAccessor"
}
]
},
"nullLiteral": {
"match": "(?)|((<([^<>]|<[^<>]+>)+>\\s*)?\\(([^()]|\\([^()]*\\))*\\)(\\s*:\\s*(.)*)?\\s*=>)))|(:\\s*((<)|(\\(\\s*((\\))|(\\.\\.\\.)|([$_[:alnum:]]+\\s*(([,:=?])|(\\)\\s*=>))))))))"
},
{
"captures": {
"1": {
"name": "storage.modifier.ts"
},
"2": {
"name": "storage.modifier.ts"
},
"3": {
"name": "keyword.operator.rest.ts"
},
"4": {
"name": "variable.parameter.ts"
},
"5": {
"name": "keyword.operator.optional.ts"
}
},
"match": "(?:\\s*\\b(readonly)\\s+)?(?:\\s*\\b(p(?:ublic|rivate|rotected))\\s+)?(\\.\\.\\.)?\\s*(?\\[]|=>|&(?!&)|\\|(?!\\|)))))([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>|<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>|<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>)*(?))*(?)*(?\\s*)?`)",
"end": "(?=`)",
"patterns": [
{
"begin": "(?=(([$_[:alpha:]][$_[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([$_[:alpha:]][$_[:alnum:]]*))",
"end": "(?=(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>|<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>|<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>)*(?))*(?)*(?\\s*)?`)",
"patterns": [
{
"include": "#support-function-call-identifiers"
},
{
"match": "([$_[:alpha:]][$_[:alnum:]]*)",
"name": "entity.name.function.tagged-template.ts"
}
]
},
{
"include": "#typeArguments"
}
]
},
{
"begin": "([$_[:alpha:]][$_[:alnum:]]*)?\\s*(?=(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>|<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>|<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\{([^{}]|(\\{([^{}]|\\{[^{}]*})*}))*})|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(\\[([^]\\[]|(\\[([^]\\[]|\\[[^]\\[]*])*]))*])|('([^'\\\\]|\\\\.)*')|(\"([^\"\\\\]|\\\\.)*\")|(`([^\\\\`]|\\\\.)*`))(?=\\s*([,.<>\\[]|=>|&(?!&)|\\|(?!\\|)))))([^(<>]|(\\(([^()]|(\\(([^()]|\\([^()]*\\))*\\)))*\\))|(?<==)>)*(?))*(?)*(?\\s*)`)",
"beginCaptures": {
"1": {
"name": "entity.name.function.tagged-template.ts"
}
},
"end": "(?=`)",
"patterns": [
{
"include": "#typeArguments"
}
]
}
]
},
"templateLiteralSubstitutionElement": {
"begin": "\\$\\{",
"beginCaptures": {
"0": {
"name": "punctuation.definition.template-expression.begin.ts"
}
},
"contentName": "meta.embedded.line.ts",
"end": "}",
"endCaptures": {
"0": {
"name": "punctuation.definition.template-expression.end.ts"
}
},
"name": "meta.template.expression.ts",
"patterns": [
{
"include": "#ngExpression"
}
]
},
"ternaryExpression": {
"begin": "(?!\\?\\.\\s*\\D)(\\?)(?!\\?)",
"beginCaptures": {
"1": {
"name": "keyword.operator.ternary.ts"
}
},
"end": "\\s*(:)",
"endCaptures": {
"1": {
"name": "keyword.operator.ternary.ts"
}
},
"patterns": [
{
"include": "#ngExpression"
}
]
},
"thisLiteral": {
"match": "(?])|(?<=[]$)>_}[:alpha:]])\\s*(?=\\{)",
"name": "meta.type.annotation.ts",
"patterns": [
{
"include": "#type"
}
]
},
"typeArguments": {
"begin": "<",
"beginCaptures": {
"0": {
"name": "punctuation.definition.typeparameters.begin.ts"
}
},
"end": ">",
"endCaptures": {
"0": {
"name": "punctuation.definition.typeparameters.end.ts"
}
},
"name": "meta.type.parameters.ts",
"patterns": [
{
"include": "#typeArgumentsBody"
}
]
},
"typeArgumentsBody": {
"patterns": [
{
"captures": {
"0": {
"name": "keyword.operator.type.ts"
}
},
"match": "(?)\\s*(?=\\()",
"end": "(?<=\\))",
"include": "#typeofOperator",
"name": "meta.type.function.ts",
"patterns": [
{
"include": "#functionParameters"
}
]
},
{
"begin": "((?=\\(\\s*((\\))|(\\.\\.\\.)|([$_[:alnum:]]+\\s*(([,:=?])|(\\)\\s*=>))))))",
"end": "(?<=\\))",
"name": "meta.type.function.ts",
"patterns": [
{
"include": "#functionParameters"
}
]
}
]
},
"typeName": {
"patterns": [
{
"captures": {
"1": {
"name": "entity.name.type.module.ts"
},
"2": {
"name": "punctuation.accessor.ts"
}
},
"match": "([$_[:alpha:]][$_[:alnum:]]*)\\s*([!?]?\\.)"
},
{
"match": "[$_[:alpha:]][$_[:alnum:]]*",
"name": "entity.name.type.ts"
}
]
},
"typeObject": {
"begin": "\\{",
"beginCaptures": {
"0": {
"name": "punctuation.definition.block.ts"
}
},
"end": "}",
"endCaptures": {
"0": {
"name": "punctuation.definition.block.ts"
}
},
"name": "meta.object.type.ts",
"patterns": [
{
"include": "#typeObjectMembers"
}
]
},
"typeObjectMembers": {
"patterns": [
{
"include": "#typeAnnotation"
},
{
"include": "#punctuationComma"
},
{
"include": "#punctuationSemicolon"
}
]
},
"typeOperators": {
"patterns": [
{
"include": "#typeofOperator"
},
{
"match": "[\\&|]",
"name": "keyword.operator.type.ts"
},
{
"match": "(?