Skip to content

Commit 163b395

Browse files
committed
Create new satisfies_expression rule
1 parent fe0763f commit 163b395

File tree

9 files changed

+224714
-222716
lines changed

9 files changed

+224714
-222716
lines changed

common/corpus/declarations.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -462,11 +462,11 @@ bar satisfies number[]
462462

463463
(program
464464
(expression_statement
465-
(cast_expression
466-
(cast_expression (identifier) (predefined_type))
465+
(as_expression
466+
(as_expression (identifier) (predefined_type))
467467
(generic_type (type_identifier) (type_arguments (predefined_type)))))
468468
(expression_statement
469-
(cast_expression (identifier) (array_type (predefined_type)))))
469+
(satisfies_expression (identifier) (array_type (predefined_type)))))
470470

471471
=================================
472472
Ambient export function declarations

common/corpus/expressions.txt

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,56 @@
11
==================================
2-
Cast expressions
2+
As expressions
33
==================================
44

55
h as `hello`
66
T as {} & { [t: T]: T }
7+
T as {} & { [t: T]: T } & { [g: G]: G }
8+
9+
---
10+
11+
(program
12+
(expression_statement (as_expression (identifier) (template_literal_type)))
13+
(expression_statement
14+
(as_expression
15+
(identifier)
16+
(intersection_type
17+
(object_type)
18+
(object_type
19+
(index_signature
20+
(identifier)
21+
(type_identifier)
22+
(type_annotation (type_identifier)))))))
23+
(expression_statement
24+
(as_expression
25+
(identifier)
26+
(intersection_type
27+
(intersection_type
28+
(object_type)
29+
(object_type
30+
(index_signature
31+
(identifier)
32+
(type_identifier)
33+
(type_annotation (type_identifier)))))
34+
(object_type
35+
(index_signature
36+
(identifier)
37+
(type_identifier)
38+
(type_annotation (type_identifier))))))))
39+
40+
==================================
41+
Satisfies expressions
42+
==================================
43+
44+
h satisfies `hello`
45+
T satisfies {} & { [t: T]: T }
746
T satisfies {} & { [t: T]: T } & { [g: G]: G }
847

948
---
1049

1150
(program
12-
(expression_statement (cast_expression (identifier) (template_literal_type)))
51+
(expression_statement (satisfies_expression (identifier) (template_literal_type)))
1352
(expression_statement
14-
(cast_expression
53+
(satisfies_expression
1554
(identifier)
1655
(intersection_type
1756
(object_type)
@@ -21,7 +60,7 @@ T satisfies {} & { [t: T]: T } & { [g: G]: G }
2160
(type_identifier)
2261
(type_annotation (type_identifier)))))))
2362
(expression_statement
24-
(cast_expression
63+
(satisfies_expression
2564
(identifier)
2665
(intersection_type
2766
(intersection_type

common/define-grammar.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ module.exports = function defineGrammar(dialect) {
4747
[$.type_query, $.subscript_expression, $.expression],
4848
[$.type_query, $._type_query_subscript_expression],
4949
[$.nested_type_identifier, $.generic_type, $._primary_type, $.lookup_type, $.index_type_query, $._type],
50-
[$.cast_expression, $._primary_type],
50+
[$.as_expression, $.satisfies_expression, $._primary_type],
5151
[$._type_query_member_expression, $.member_expression],
5252
[$._type_query_member_expression, $.primary_expression],
5353
[$._type_query_subscript_expression, $.subscript_expression],
@@ -207,7 +207,8 @@ module.exports = function defineGrammar(dialect) {
207207
// include type assertions. If the dialect is TSX, we do the opposite.
208208
expression: ($, previous) => {
209209
const choices = [
210-
$.cast_expression,
210+
$.as_expression,
211+
$.satisfies_expression,
211212
$.internal_module,
212213
];
213214

@@ -403,9 +404,15 @@ module.exports = function defineGrammar(dialect) {
403404
$.expression
404405
)),
405406

406-
cast_expression: $ => prec.left('binary', seq(
407+
as_expression: $ => prec.left('binary', seq(
407408
$.expression,
408-
choice('as', 'satisfies'),
409+
'as',
410+
$._type
411+
)),
412+
413+
satisfies_expression: $ => prec.left('binary', seq(
414+
$.expression,
415+
'satisfies',
409416
$._type
410417
)),
411418

tsx/src/grammar.json

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,7 +1898,11 @@
18981898
"members": [
18991899
{
19001900
"type": "SYMBOL",
1901-
"name": "cast_expression"
1901+
"name": "as_expression"
1902+
},
1903+
{
1904+
"type": "SYMBOL",
1905+
"name": "satisfies_expression"
19021906
},
19031907
{
19041908
"type": "SYMBOL",
@@ -7440,7 +7444,7 @@
74407444
]
74417445
}
74427446
},
7443-
"cast_expression": {
7447+
"as_expression": {
74447448
"type": "PREC_LEFT",
74457449
"value": "binary",
74467450
"content": {
@@ -7451,17 +7455,29 @@
74517455
"name": "expression"
74527456
},
74537457
{
7454-
"type": "CHOICE",
7455-
"members": [
7456-
{
7457-
"type": "STRING",
7458-
"value": "as"
7459-
},
7460-
{
7461-
"type": "STRING",
7462-
"value": "satisfies"
7463-
}
7464-
]
7458+
"type": "STRING",
7459+
"value": "as"
7460+
},
7461+
{
7462+
"type": "SYMBOL",
7463+
"name": "_type"
7464+
}
7465+
]
7466+
}
7467+
},
7468+
"satisfies_expression": {
7469+
"type": "PREC_LEFT",
7470+
"value": "binary",
7471+
"content": {
7472+
"type": "SEQ",
7473+
"members": [
7474+
{
7475+
"type": "SYMBOL",
7476+
"name": "expression"
7477+
},
7478+
{
7479+
"type": "STRING",
7480+
"value": "satisfies"
74657481
},
74667482
{
74677483
"type": "SYMBOL",
@@ -10958,7 +10974,11 @@
1095810974
[
1095910975
{
1096010976
"type": "SYMBOL",
10961-
"name": "cast_expression"
10977+
"name": "as_expression"
10978+
},
10979+
{
10980+
"type": "SYMBOL",
10981+
"name": "satisfies_expression"
1096210982
},
1096310983
{
1096410984
"type": "SYMBOL",

tsx/src/node-types.json

Lines changed: 80 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@
147147
"type": "expression",
148148
"named": true,
149149
"subtypes": [
150+
{
151+
"type": "as_expression",
152+
"named": true
153+
},
150154
{
151155
"type": "assignment_expression",
152156
"named": true
@@ -163,10 +167,6 @@
163167
"type": "binary_expression",
164168
"named": true
165169
},
166-
{
167-
"type": "cast_expression",
168-
"named": true
169-
},
170170
{
171171
"type": "glimmer_template",
172172
"named": true
@@ -195,6 +195,10 @@
195195
"type": "primary_expression",
196196
"named": true
197197
},
198+
{
199+
"type": "satisfies_expression",
200+
"named": true
201+
},
198202
{
199203
"type": "ternary_expression",
200204
"named": true
@@ -763,6 +767,41 @@
763767
}
764768
}
765769
},
770+
{
771+
"type": "as_expression",
772+
"named": true,
773+
"fields": {},
774+
"children": {
775+
"multiple": true,
776+
"required": true,
777+
"types": [
778+
{
779+
"type": "_primary_type",
780+
"named": true
781+
},
782+
{
783+
"type": "constructor_type",
784+
"named": true
785+
},
786+
{
787+
"type": "expression",
788+
"named": true
789+
},
790+
{
791+
"type": "function_type",
792+
"named": true
793+
},
794+
{
795+
"type": "infer_type",
796+
"named": true
797+
},
798+
{
799+
"type": "readonly_type",
800+
"named": true
801+
}
802+
]
803+
}
804+
},
766805
{
767806
"type": "asserts",
768807
"named": true,
@@ -1221,41 +1260,6 @@
12211260
}
12221261
}
12231262
},
1224-
{
1225-
"type": "cast_expression",
1226-
"named": true,
1227-
"fields": {},
1228-
"children": {
1229-
"multiple": true,
1230-
"required": true,
1231-
"types": [
1232-
{
1233-
"type": "_primary_type",
1234-
"named": true
1235-
},
1236-
{
1237-
"type": "constructor_type",
1238-
"named": true
1239-
},
1240-
{
1241-
"type": "expression",
1242-
"named": true
1243-
},
1244-
{
1245-
"type": "function_type",
1246-
"named": true
1247-
},
1248-
{
1249-
"type": "infer_type",
1250-
"named": true
1251-
},
1252-
{
1253-
"type": "readonly_type",
1254-
"named": true
1255-
}
1256-
]
1257-
}
1258-
},
12591263
{
12601264
"type": "catch_clause",
12611265
"named": true,
@@ -4899,6 +4903,41 @@
48994903
]
49004904
}
49014905
},
4906+
{
4907+
"type": "satisfies_expression",
4908+
"named": true,
4909+
"fields": {},
4910+
"children": {
4911+
"multiple": true,
4912+
"required": true,
4913+
"types": [
4914+
{
4915+
"type": "_primary_type",
4916+
"named": true
4917+
},
4918+
{
4919+
"type": "constructor_type",
4920+
"named": true
4921+
},
4922+
{
4923+
"type": "expression",
4924+
"named": true
4925+
},
4926+
{
4927+
"type": "function_type",
4928+
"named": true
4929+
},
4930+
{
4931+
"type": "infer_type",
4932+
"named": true
4933+
},
4934+
{
4935+
"type": "readonly_type",
4936+
"named": true
4937+
}
4938+
]
4939+
}
4940+
},
49024941
{
49034942
"type": "sequence_expression",
49044943
"named": true,
@@ -6255,11 +6294,11 @@
62556294
},
62566295
{
62576296
"type": "number",
6258-
"named": true
6297+
"named": false
62596298
},
62606299
{
62616300
"type": "number",
6262-
"named": false
6301+
"named": true
62636302
},
62646303
{
62656304
"type": "object",

0 commit comments

Comments
 (0)