{ "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": "(?