fix(vscode-extension): add syntax highlighting for arrow functions

Updates the syntax definition to handle arrow functions. The definition is largely based on TypeScript's own syntax highlighting since it's quite complex.

(cherry picked from commit b95753eb7d)
This commit is contained in:
Kristiyan Kostadinov
2026-01-13 11:04:43 +01:00
committed by Jessica Janiuk
parent 8f16846dd9
commit a649fc8f57
4 changed files with 348 additions and 0 deletions
@@ -16,6 +16,9 @@
{
"include": "#literal"
},
{
"include": "#arrowFunction"
},
{
"include": "#ternaryExpression"
},
@@ -971,6 +974,44 @@
"include": "#ngExpression"
}
]
},
"arrowFunction": {
"patterns": [
{
"name": "meta.arrow.ts",
"match": "(?:(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))\\basync\\s+)?([_$[:alpha:]][_$[:alnum:]]*)\\s*(?==>)",
"captures": {
"1": {
"name": "variable.parameter.ts"
}
}
},
{
"name": "meta.arrow.ts",
"begin": "(?x) (?:\n (?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(\\basync)\n)? ((?<![})!\\]])\\s*\n (?=\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\'\\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n )\n)",
"end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|(?:\\busing(?=\\s+(?!in\\b|of\\b(?!\\s*(?:of\\b|=)))[_$[:alpha:]])\\b)|(?:\\bawait\\s+(?:\\busing(?=\\s+(?!in\\b|of\\b(?!\\s*(?:of\\b|=)))[_$[:alpha:]])\\b)\\b)|const|import|enum|namespace|module|type|abstract|declare)\\s+))",
"patterns": [
{
"include": "#functionParameters"
}
]
},
{
"name": "meta.arrow.ts",
"begin": "=>",
"beginCaptures": {
"0": {
"name": "storage.type.function.arrow.ts"
}
},
"end": "((?<=\\}|\\S)(?<!=>)|((?!\\{)(?=\\S)))(?!\\/[\\/\\*])",
"patterns": [
{
"include": "#ngExpression"
}
]
}
]
}
}
}
@@ -22,6 +22,9 @@ export const Expression: GrammarDefinition = {
{
include: '#literal',
},
{
include: '#arrowFunction',
},
{
include: '#ternaryExpression',
},
@@ -982,5 +985,47 @@ export const Expression: GrammarDefinition = {
},
],
},
// Via https://github.com/microsoft/vscode-typescript-next/blob/2db036c6a8c4000dbe8cfc591512b1a6f4e666d0/syntaxes/TypeScript.tmLanguage.json#L1509
arrowFunction: {
patterns: [
{
name: 'meta.arrow.ts',
match:
/(?:(?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))\basync\s+)?([_$[:alpha:]][_$[:alnum:]]*)\s*(?==>)/,
captures: {
1: {
name: 'variable.parameter.ts',
},
},
},
{
name: 'meta.arrow.ts',
begin:
'(?x) (?:\n (?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(\\basync)\n)? ((?<![})!\\]])\\s*\n (?=\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*(((const\\s+)?[_$[:alpha:]])|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{([^\\{\\}]|\\{[^\\{\\}]*\\})*\\}))*\\})|(\\[([^\\[\\]]|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()\\\'\\"\\`]|(\\(([^\\(\\)]|(\\(([^\\(\\)]|\\([^\\(\\)]*\\))*\\)))*\\))|(\\\'([^\\\'\\\\]|\\\\.)*\\\')|(\\"([^\\"\\\\]|\\\\.)*\\")|(\\`([^\\`\\\\]|\\\\.)*\\`))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<([^<>]|\\<[^<>]+\\>)+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n )\n)',
end: '(?==>|\\{|(^\\s*(export|function|class|interface|let|var|(?:\\busing(?=\\s+(?!in\\b|of\\b(?!\\s*(?:of\\b|=)))[_$[:alpha:]])\\b)|(?:\\bawait\\s+(?:\\busing(?=\\s+(?!in\\b|of\\b(?!\\s*(?:of\\b|=)))[_$[:alpha:]])\\b)\\b)|const|import|enum|namespace|module|type|abstract|declare)\\s+))',
patterns: [
{
include: '#functionParameters',
},
],
},
{
name: 'meta.arrow.ts',
begin: '=>',
beginCaptures: {
'0': {
name: 'storage.type.function.arrow.ts',
},
},
end: '((?<=\\}|\\S)(?<!=>)|((?!\\{)(?=\\S)))(?!\\/[\\/\\*])',
patterns: [
{
include: '#ngExpression',
},
],
},
],
},
},
};
@@ -104,3 +104,16 @@ as i }}
<!-- Rest -->
{{ someFn(1, ...foo, 2, ...bar, 3, ...baz) }}
<!-- Arrow functions -->
{{ foo => foo + 1 }}
{{ (foo, bar, baz) => foo + bar + baz }}
{{ (foo, bar) => [foo, bar, 1, 2] }}
{{ (foo, bar) => ({foo: 1, bar: 2}) }}
{{ a => (b, c) => (d, e) => f => a + b + c + d + e + f }}
{{ ((a, b) => a * b)(2, 3) }}
{{ [a => a + 1, (b, c) => b + c] }}
{{ (a, b) =>
a / b + 123
}}
{{ someSignal.update(prev => prev + 1) }}
@@ -1283,4 +1283,253 @@
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>
><!-- Arrow functions -->
#^^^^^^^^^^^^^^^^^^^^^^^^^ template.ng
>{{ foo => foo + 1 }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng
# ^^^ template.ng expression.ng meta.arrow.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng constant.numeric.decimal.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>{{ (foo, bar, baz) => foo + bar + baz }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^^^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts
# ^^^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts
# ^^^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^^^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^^^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>{{ (foo, bar) => [foo, bar, 1, 2] }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^^^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts
# ^^^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.brace.square.ts
# ^^^ template.ng expression.ng meta.array.literal.ts variable.other.readwrite.ts
# ^ template.ng expression.ng meta.array.literal.ts punctuation.separator.comma.ts
# ^ template.ng expression.ng meta.array.literal.ts
# ^^^ template.ng expression.ng meta.array.literal.ts variable.other.readwrite.ts
# ^ template.ng expression.ng meta.array.literal.ts punctuation.separator.comma.ts
# ^ template.ng expression.ng meta.array.literal.ts
# ^ template.ng expression.ng meta.array.literal.ts constant.numeric.decimal.ts
# ^ template.ng expression.ng meta.array.literal.ts punctuation.separator.comma.ts
# ^ template.ng expression.ng meta.array.literal.ts
# ^ template.ng expression.ng meta.array.literal.ts constant.numeric.decimal.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.brace.square.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>{{ (foo, bar) => ({foo: 1, bar: 2}) }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^^^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts
# ^^^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng
# ^^^ template.ng expression.ng variable.other.readwrite.ts
# ^^ template.ng expression.ng
# ^ template.ng expression.ng constant.numeric.decimal.ts
# ^ template.ng expression.ng punctuation.separator.comma.ts
# ^ template.ng expression.ng
# ^^^ template.ng expression.ng variable.other.readwrite.ts
# ^^ template.ng expression.ng
# ^ template.ng expression.ng constant.numeric.decimal.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>{{ a => (b, c) => (d, e) => f => a + b + c + d + e + f }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng meta.arrow.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.arrow.ts meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>{{ ((a, b) => a * b)(2, 3) }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng constant.numeric.decimal.ts
# ^ template.ng expression.ng punctuation.separator.comma.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng constant.numeric.decimal.ts
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>{{ [a => a + 1, (b, c) => b + c] }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng meta.array.literal.ts meta.brace.square.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts variable.parameter.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts
# ^^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts
# ^ template.ng expression.ng meta.array.literal.ts variable.other.readwrite.ts
# ^ template.ng expression.ng meta.array.literal.ts
# ^ template.ng expression.ng meta.array.literal.ts keyword.operator.arithmetic.ts
# ^ template.ng expression.ng meta.array.literal.ts
# ^ template.ng expression.ng meta.array.literal.ts constant.numeric.decimal.ts
# ^ template.ng expression.ng meta.array.literal.ts punctuation.separator.comma.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts meta.parameters.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts
# ^^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.arrow.ts
# ^ template.ng expression.ng meta.array.literal.ts variable.other.readwrite.ts
# ^ template.ng expression.ng meta.array.literal.ts
# ^ template.ng expression.ng meta.array.literal.ts keyword.operator.arithmetic.ts
# ^ template.ng expression.ng meta.array.literal.ts
# ^ template.ng expression.ng meta.array.literal.ts variable.other.readwrite.ts
# ^ template.ng expression.ng meta.array.literal.ts meta.brace.square.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>{{ (a, b) =>
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.separator.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
> a / b + 123
#^^^^ template.ng expression.ng meta.arrow.ts
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^^^ template.ng expression.ng constant.numeric.decimal.ts
>}}
#^^ template.ng punctuation.definition.block.ts
>{{ someSignal.update(prev => prev + 1) }}
#^^ template.ng punctuation.definition.block.ts
# ^ template.ng expression.ng
# ^^^^^^^^^^ template.ng expression.ng variable.other.object.ts
# ^ template.ng expression.ng punctuation.accessor.ts
# ^^^^^^ template.ng expression.ng entity.name.function.ts
# ^ template.ng expression.ng meta.brace.round.ts
# ^^^^ template.ng expression.ng meta.arrow.ts variable.parameter.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^ template.ng expression.ng meta.arrow.ts storage.type.function.arrow.ts
# ^ template.ng expression.ng meta.arrow.ts
# ^^^^ template.ng expression.ng variable.other.readwrite.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng keyword.operator.arithmetic.ts
# ^ template.ng expression.ng
# ^ template.ng expression.ng constant.numeric.decimal.ts
# ^ template.ng expression.ng meta.brace.round.ts
# ^ template.ng expression.ng
# ^^ template.ng punctuation.definition.block.ts
>