Skip to content

Commit db11e74

Browse files
JeanMechethePunderWoman
authored andcommitted
refactor(vscode-extension): Add support for exhaustive type check in the syntax
`@default never` will be considered a keyword on its own.
1 parent 9dc3ca4 commit db11e74

4 files changed

Lines changed: 65 additions & 2 deletions

File tree

vscode-ng-language-service/syntaxes/src/template-blocks.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const TemplateBlocks: GrammarDefinition = {
3939
2: {name: 'keyword.control.block.kind.ng'},
4040
},
4141
patterns: [{include: '#blockExpression'}],
42-
end: /(?=@|{)/,
42+
end: /(?=@|{|})/,
4343
name: 'control.block.case.header.ng',
4444
},
4545
caseBlock: {
@@ -48,6 +48,15 @@ export const TemplateBlocks: GrammarDefinition = {
4848
end: /(?<=\})/,
4949
name: 'control.block.case.ng',
5050
},
51+
caseExhaustive: {
52+
match: /(@)(default\s+never)\s*(;)/,
53+
captures: {
54+
1: {patterns: [{include: '#transition'}]},
55+
2: {name: 'keyword.control.block.kind.ng'},
56+
3: {name: 'punctuation.terminator.statement.ng'},
57+
},
58+
name: 'control.block.case.ng',
59+
},
5160
blockExpression: {
5261
begin: /\(/,
5362
beginCaptures: {
@@ -105,6 +114,7 @@ export const TemplateBlocks: GrammarDefinition = {
105114
},
106115
contentName: 'control.block.body.ng',
107116
patterns: [
117+
{include: '#caseExhaustive'},
108118
{include: '#caseBlock'},
109119
{include: 'text.html.derivative'},
110120
{include: 'template.ng'},

vscode-ng-language-service/syntaxes/template-blocks.json

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"include": "#blockExpression"
5656
}
5757
],
58-
"end": "(?=@|{)",
58+
"end": "(?=@|{|})",
5959
"name": "control.block.case.header.ng"
6060
},
6161
"caseBlock": {
@@ -71,6 +71,25 @@
7171
"end": "(?<=\\})",
7272
"name": "control.block.case.ng"
7373
},
74+
"caseExhaustive": {
75+
"match": "(@)(default\\s+never)\\s*(;)",
76+
"captures": {
77+
"1": {
78+
"patterns": [
79+
{
80+
"include": "#transition"
81+
}
82+
]
83+
},
84+
"2": {
85+
"name": "keyword.control.block.kind.ng"
86+
},
87+
"3": {
88+
"name": "punctuation.terminator.statement.ng"
89+
}
90+
},
91+
"name": "control.block.case.ng"
92+
},
7493
"blockExpression": {
7594
"begin": "\\(",
7695
"beginCaptures": {
@@ -160,6 +179,9 @@
160179
},
161180
"contentName": "control.block.body.ng",
162181
"patterns": [
182+
{
183+
"include": "#caseExhaustive"
184+
},
163185
{
164186
"include": "#caseBlock"
165187
},

vscode-ng-language-service/syntaxes/test/data/template-blocks.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
}
1919
}
2020

21+
@switch(aOrb) {
22+
@case(a) {}
23+
@default never;
24+
}
25+
2126
@if (a==b) { hello } @else { goodbye }
2227

2328
@if (a==b) {

vscode-ng-language-service/syntaxes/test/data/template-blocks.html.snap

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,32 @@
104104
>}
105105
#^ template.blocks.ng control.block.ng punctuation.definition.block.ts
106106
>
107+
>@switch(aOrb) {
108+
#^ template.blocks.ng control.block.ng keyword.control.block.transition.ng
109+
# ^^^^^^ template.blocks.ng control.block.ng keyword.control.block.kind.ng
110+
# ^ template.blocks.ng control.block.ng meta.brace.round.ts
111+
# ^^^^ template.blocks.ng control.block.ng control.block.expression.ng variable.other.readwrite.ts
112+
# ^ template.blocks.ng control.block.ng meta.brace.round.ts
113+
# ^ template.blocks.ng control.block.ng
114+
# ^ template.blocks.ng control.block.ng punctuation.definition.block.ts
115+
> @case(a) {}
116+
#^^^^ template.blocks.ng control.block.ng control.block.body.ng
117+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng keyword.control.block.transition.ng
118+
# ^^^^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng keyword.control.block.kind.ng
119+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng meta.brace.round.ts
120+
# ^ 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
121+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng meta.brace.round.ts
122+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng control.block.case.header.ng
123+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng punctuation.definition.block.ts
124+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng punctuation.definition.block.ts
125+
> @default never;
126+
#^^^^ template.blocks.ng control.block.ng control.block.body.ng
127+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng keyword.control.block.transition.ng
128+
# ^^^^^^^^^^^^^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng keyword.control.block.kind.ng
129+
# ^ template.blocks.ng control.block.ng control.block.body.ng control.block.case.ng punctuation.terminator.statement.ng
130+
>}
131+
#^ template.blocks.ng control.block.ng punctuation.definition.block.ts
132+
>
107133
>@if (a==b) { hello } @else { goodbye }
108134
#^ template.blocks.ng control.block.ng keyword.control.block.transition.ng
109135
# ^^ template.blocks.ng control.block.ng keyword.control.block.kind.ng

0 commit comments

Comments
 (0)