refactor(vscode-extension): Add support for exhaustive type check in the syntax

`@default never` will be considered a keyword on its own.

(cherry picked from commit db11e74b3d)
This commit is contained in:
Matthieu Riegler 2026-02-24 19:28:52 +01:00 committed by Jessica Janiuk
parent 1a151f2dae
commit 787cd875b0
4 changed files with 65 additions and 2 deletions

View file

@ -39,7 +39,7 @@ export const TemplateBlocks: GrammarDefinition = {
2: {name: 'keyword.control.block.kind.ng'},
},
patterns: [{include: '#blockExpression'}],
end: /(?=@|{)/,
end: /(?=@|{|})/,
name: 'control.block.case.header.ng',
},
caseBlock: {
@ -48,6 +48,15 @@ export const TemplateBlocks: GrammarDefinition = {
end: /(?<=\})/,
name: 'control.block.case.ng',
},
caseExhaustive: {
match: /(@)(default\s+never)\s*(;)/,
captures: {
1: {patterns: [{include: '#transition'}]},
2: {name: 'keyword.control.block.kind.ng'},
3: {name: 'punctuation.terminator.statement.ng'},
},
name: 'control.block.case.ng',
},
blockExpression: {
begin: /\(/,
beginCaptures: {
@ -105,6 +114,7 @@ export const TemplateBlocks: GrammarDefinition = {
},
contentName: 'control.block.body.ng',
patterns: [
{include: '#caseExhaustive'},
{include: '#caseBlock'},
{include: 'text.html.derivative'},
{include: 'template.ng'},

View file

@ -55,7 +55,7 @@
"include": "#blockExpression"
}
],
"end": "(?=@|{)",
"end": "(?=@|{|})",
"name": "control.block.case.header.ng"
},
"caseBlock": {
@ -71,6 +71,25 @@
"end": "(?<=\\})",
"name": "control.block.case.ng"
},
"caseExhaustive": {
"match": "(@)(default\\s+never)\\s*(;)",
"captures": {
"1": {
"patterns": [
{
"include": "#transition"
}
]
},
"2": {
"name": "keyword.control.block.kind.ng"
},
"3": {
"name": "punctuation.terminator.statement.ng"
}
},
"name": "control.block.case.ng"
},
"blockExpression": {
"begin": "\\(",
"beginCaptures": {
@ -160,6 +179,9 @@
},
"contentName": "control.block.body.ng",
"patterns": [
{
"include": "#caseExhaustive"
},
{
"include": "#caseBlock"
},

View file

@ -18,6 +18,11 @@
}
}
@switch(aOrb) {
@case(a) {}
@default never;
}
@if (a==b) { hello } @else { goodbye }
@if (a==b) {

View file

@ -104,6 +104,32 @@
>}
#^ template.blocks.ng control.block.ng punctuation.definition.block.ts
>
>@switch(aOrb) {
#^ template.blocks.ng control.block.ng keyword.control.block.transition.ng
# ^^^^^^ template.blocks.ng control.block.ng keyword.control.block.kind.ng
# ^ template.blocks.ng control.block.ng meta.brace.round.ts
# ^^^^ template.blocks.ng control.block.ng control.block.expression.ng variable.other.readwrite.ts
# ^ template.blocks.ng control.block.ng meta.brace.round.ts
# ^ template.blocks.ng control.block.ng
# ^ template.blocks.ng control.block.ng punctuation.definition.block.ts
> @case(a) {}
#^^^^ template.blocks.ng control.block.ng control.block.body.ng
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng keyword.control.block.transition.ng
# ^^^^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng keyword.control.block.kind.ng
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng meta.brace.round.ts
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng control.block.expression.ng variable.other.readwrite.ts
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng meta.brace.round.ts
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng punctuation.definition.block.ts
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng punctuation.definition.block.ts
> @default never;
#^^^^ template.blocks.ng control.block.ng control.block.body.ng
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng keyword.control.block.transition.ng
# ^^^^^^^^^^^^^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng keyword.control.block.kind.ng
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng punctuation.terminator.statement.ng
>}
#^ template.blocks.ng control.block.ng punctuation.definition.block.ts
>
>@if (a==b) { hello } @else { goodbye }
#^ template.blocks.ng control.block.ng keyword.control.block.transition.ng
# ^^ template.blocks.ng control.block.ng keyword.control.block.kind.ng