Skip to content

Commit 9be6a70

Browse files
committed
parser: add more wrapper nodes in syntax tree
Found these by messing around with the expand selection I suspect we'll find more cases when we have to navigate more of the tree
1 parent 84b772d commit 9be6a70

26 files changed

+1524
-1182
lines changed

crates/squawk_ide/src/expand_selection.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,13 +567,16 @@ $0
567567
JSON_TABLE_COLUMN_LIST,
568568
OPTIONS_LIST,
569569
PARAM_LIST,
570+
PARTITION_ITEM_LIST,
571+
ROW_LIST,
570572
SET_OPTIONS_LIST,
571573
TABLE_ARG_LIST,
572574
TABLE_LIST,
573575
TARGET_LIST,
574576
TRANSACTION_MODE_LIST,
575577
VACUUM_OPTION_LIST,
576578
VARIANT_LIST,
579+
WHEN_CLAUSE_LIST,
577580
XML_TABLE_COLUMN_LIST,
578581
]
579582
");

crates/squawk_parser/src/generated/syntax_kind.rs

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/squawk_parser/src/grammar.rs

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -183,20 +183,35 @@ fn case_expr(p: &mut Parser<'_>) -> CompletedMarker {
183183
if !p.at(WHEN_KW) && expr(p).is_none() {
184184
p.error("expected an expression");
185185
}
186+
when_clause_list(p);
187+
opt_else_clause(p);
188+
p.expect(END_KW);
189+
m.complete(p, CASE_EXPR)
190+
}
191+
192+
fn when_clause_list(p: &mut Parser<'_>) {
193+
let m = p.start();
186194
while !p.at(EOF) {
187195
when_clause(p);
188196
if !p.at(WHEN_KW) {
189197
break;
190198
}
191199
}
192-
// case_default
193-
// | ELSE a_expr
194-
// | /* empty */
200+
m.complete(p, WHEN_CLAUSE_LIST);
201+
}
202+
203+
// case_default
204+
// | ELSE a_expr
205+
// | /* empty */
206+
fn opt_else_clause(p: &mut Parser<'_>) {
207+
if !p.at(ELSE_KW) {
208+
return;
209+
}
210+
let m = p.start();
195211
if p.eat(ELSE_KW) && expr(p).is_none() {
196212
p.error("expected an expression");
197213
}
198-
p.expect(END_KW);
199-
m.complete(p, CASE_EXPR)
214+
m.complete(p, ELSE_CLAUSE);
200215
}
201216

202217
// when_clause:
@@ -10917,21 +10932,23 @@ fn set_transaction(p: &mut Parser<'_>) -> CompletedMarker {
1091710932
fn values(p: &mut Parser<'_>, m: Option<Marker>) -> CompletedMarker {
1091810933
let m = m.unwrap_or_else(|| p.start());
1091910934
p.bump(VALUES_KW);
10920-
// TODO: generalize this
10935+
row_list(p);
10936+
opt_order_by_clause(p);
10937+
opt_limit_clause(p);
10938+
opt_offset_clause(p);
10939+
opt_fetch_clause(p);
10940+
m.complete(p, VALUES)
10941+
}
10942+
10943+
// ( expression [, ...] ) [, ...]
10944+
fn row_list(p: &mut Parser<'_>) {
10945+
let m = p.start();
1092110946
while !p.at(EOF) {
1092210947
if !p.at(L_PAREN) {
1092310948
p.err_and_bump("expected L_PAREN");
1092410949
continue;
1092510950
}
10926-
delimited(
10927-
p,
10928-
L_PAREN,
10929-
R_PAREN,
10930-
COMMA,
10931-
|| "expected expression".to_string(),
10932-
EXPR_FIRST,
10933-
|p| expr(p).is_some(),
10934-
);
10951+
row(p);
1093510952
if !p.eat(COMMA) {
1093610953
if p.at(L_PAREN) {
1093710954
p.error("expected COMMA");
@@ -10940,11 +10957,22 @@ fn values(p: &mut Parser<'_>, m: Option<Marker>) -> CompletedMarker {
1094010957
}
1094110958
}
1094210959
}
10943-
opt_order_by_clause(p);
10944-
opt_limit_clause(p);
10945-
opt_offset_clause(p);
10946-
opt_fetch_clause(p);
10947-
m.complete(p, VALUES)
10960+
m.complete(p, ROW_LIST);
10961+
}
10962+
10963+
// ( expression [, ...] )
10964+
fn row(p: &mut Parser<'_>) {
10965+
let m = p.start();
10966+
delimited(
10967+
p,
10968+
L_PAREN,
10969+
R_PAREN,
10970+
COMMA,
10971+
|| "expected expression".to_string(),
10972+
EXPR_FIRST,
10973+
|p| expr(p).is_some(),
10974+
);
10975+
m.complete(p, ROW);
1094810976
}
1094910977

1095010978
const REINDEX_OPTION_FIRST: TokenSet = TokenSet::new(&[CONCURRENTLY_KW, VERBOSE_KW, TABLESPACE_KW]);
@@ -12375,7 +12403,7 @@ fn create_index(p: &mut Parser<'_>) -> CompletedMarker {
1237512403
// [ NULLS { FIRST | LAST } ]
1237612404
// [, ...]
1237712405
// )
12378-
index_params(p);
12406+
partition_items(p, true);
1237912407
opt_include_columns(p);
1238012408
opt_nulls_not_distinct(p);
1238112409
opt_with_params(p);
@@ -12384,12 +12412,6 @@ fn create_index(p: &mut Parser<'_>) -> CompletedMarker {
1238412412
m.complete(p, CREATE_INDEX)
1238512413
}
1238612414

12387-
fn index_params(p: &mut Parser<'_>) {
12388-
let m = p.start();
12389-
partition_items(p, true);
12390-
m.complete(p, INDEX_PARAMS);
12391-
}
12392-
1239312415
// (
1239412416
// { column_name | ( expression ) }
1239512417
// [ COLLATE collation ]
@@ -12407,6 +12429,7 @@ fn index_params(p: &mut Parser<'_>) {
1240712429
// [, ...]
1240812430
// )
1240912431
fn partition_items(p: &mut Parser<'_>, allow_extra_params: bool) {
12432+
let m = p.start();
1241012433
delimited(
1241112434
p,
1241212435
L_PAREN,
@@ -12416,6 +12439,7 @@ fn partition_items(p: &mut Parser<'_>, allow_extra_params: bool) {
1241612439
EXPR_FIRST,
1241712440
|p| opt_partition_item(p, allow_extra_params).is_some(),
1241812441
);
12442+
m.complete(p, PARTITION_ITEM_LIST);
1241912443
}
1242012444

1242112445
// [ argmode ]

crates/squawk_parser/tests/snapshots/tests__create_index_err.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ SOURCE_FILE
2121
NAME_REF
2222
IDENT "t"
2323
WHITESPACE " "
24-
INDEX_PARAMS
24+
PARTITION_ITEM_LIST
2525
L_PAREN "("
2626
PARTITION_ITEM
2727
NAME_REF

crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ SOURCE_FILE
2020
NAME_REF
2121
IDENT "t"
2222
WHITESPACE " "
23-
INDEX_PARAMS
23+
PARTITION_ITEM_LIST
2424
L_PAREN "("
2525
PARTITION_ITEM
2626
NAME_REF
@@ -64,7 +64,7 @@ SOURCE_FILE
6464
NAME_REF
6565
IDENT "bar"
6666
WHITESPACE " "
67-
INDEX_PARAMS
67+
PARTITION_ITEM_LIST
6868
L_PAREN "("
6969
PARTITION_ITEM
7070
NAME_REF
@@ -87,7 +87,7 @@ SOURCE_FILE
8787
NAME_REF
8888
IDENT "t"
8989
WHITESPACE " "
90-
INDEX_PARAMS
90+
PARTITION_ITEM_LIST
9191
L_PAREN "("
9292
PARTITION_ITEM
9393
BIN_EXPR
@@ -122,7 +122,7 @@ SOURCE_FILE
122122
NAME_REF
123123
IDENT "t"
124124
WHITESPACE " "
125-
INDEX_PARAMS
125+
PARTITION_ITEM_LIST
126126
L_PAREN "("
127127
PARTITION_ITEM
128128
NAME_REF
@@ -153,7 +153,7 @@ SOURCE_FILE
153153
NAME_REF
154154
IDENT "t"
155155
WHITESPACE " "
156-
INDEX_PARAMS
156+
PARTITION_ITEM_LIST
157157
L_PAREN "("
158158
WHITESPACE "\n "
159159
PARTITION_ITEM
@@ -218,7 +218,7 @@ SOURCE_FILE
218218
NAME_REF
219219
IDENT "t"
220220
WHITESPACE " "
221-
INDEX_PARAMS
221+
PARTITION_ITEM_LIST
222222
L_PAREN "("
223223
PARTITION_ITEM
224224
PAREN_EXPR
@@ -261,7 +261,7 @@ SOURCE_FILE
261261
NAME_REF
262262
IDENT "t"
263263
WHITESPACE " "
264-
INDEX_PARAMS
264+
PARTITION_ITEM_LIST
265265
L_PAREN "("
266266
PARTITION_ITEM
267267
NAME_REF
@@ -345,7 +345,7 @@ SOURCE_FILE
345345
NAME_REF
346346
IDENT "t"
347347
WHITESPACE " "
348-
INDEX_PARAMS
348+
PARTITION_ITEM_LIST
349349
L_PAREN "("
350350
PARTITION_ITEM
351351
NAME_REF
@@ -393,7 +393,7 @@ SOURCE_FILE
393393
NAME_REF
394394
IDENT "t"
395395
WHITESPACE " "
396-
INDEX_PARAMS
396+
PARTITION_ITEM_LIST
397397
L_PAREN "("
398398
PARTITION_ITEM
399399
NAME_REF
@@ -421,7 +421,7 @@ SOURCE_FILE
421421
NAME_REF
422422
IDENT "films"
423423
WHITESPACE " "
424-
INDEX_PARAMS
424+
PARTITION_ITEM_LIST
425425
L_PAREN "("
426426
PARTITION_ITEM
427427
NAME_REF
@@ -447,7 +447,7 @@ SOURCE_FILE
447447
NAME_REF
448448
IDENT "films"
449449
WHITESPACE " "
450-
INDEX_PARAMS
450+
PARTITION_ITEM_LIST
451451
L_PAREN "("
452452
PARTITION_ITEM
453453
NAME_REF
@@ -486,7 +486,7 @@ SOURCE_FILE
486486
NAME_REF
487487
IDENT "films"
488488
WHITESPACE " "
489-
INDEX_PARAMS
489+
PARTITION_ITEM_LIST
490490
L_PAREN "("
491491
PARTITION_ITEM
492492
NAME_REF
@@ -522,7 +522,7 @@ SOURCE_FILE
522522
NAME_REF
523523
IDENT "films"
524524
WHITESPACE " "
525-
INDEX_PARAMS
525+
PARTITION_ITEM_LIST
526526
L_PAREN "("
527527
PARTITION_ITEM
528528
PAREN_EXPR
@@ -555,7 +555,7 @@ SOURCE_FILE
555555
NAME_REF
556556
IDENT "films"
557557
WHITESPACE " "
558-
INDEX_PARAMS
558+
PARTITION_ITEM_LIST
559559
L_PAREN "("
560560
PARTITION_ITEM
561561
BIN_EXPR
@@ -585,7 +585,7 @@ SOURCE_FILE
585585
NAME_REF
586586
IDENT "films"
587587
WHITESPACE " "
588-
INDEX_PARAMS
588+
PARTITION_ITEM_LIST
589589
L_PAREN "("
590590
PARTITION_ITEM
591591
NAME_REF
@@ -616,7 +616,7 @@ SOURCE_FILE
616616
NAME_REF
617617
IDENT "films"
618618
WHITESPACE " "
619-
INDEX_PARAMS
619+
PARTITION_ITEM_LIST
620620
L_PAREN "("
621621
PARTITION_ITEM
622622
NAME_REF
@@ -660,7 +660,7 @@ SOURCE_FILE
660660
NAME_REF
661661
IDENT "GIN"
662662
WHITESPACE " "
663-
INDEX_PARAMS
663+
PARTITION_ITEM_LIST
664664
L_PAREN "("
665665
PARTITION_ITEM
666666
NAME_REF
@@ -699,7 +699,7 @@ SOURCE_FILE
699699
NAME_REF
700700
IDENT "films"
701701
WHITESPACE " "
702-
INDEX_PARAMS
702+
PARTITION_ITEM_LIST
703703
L_PAREN "("
704704
PARTITION_ITEM
705705
NAME_REF
@@ -734,7 +734,7 @@ SOURCE_FILE
734734
NAME_REF
735735
IDENT "gist"
736736
WHITESPACE " "
737-
INDEX_PARAMS
737+
PARTITION_ITEM_LIST
738738
L_PAREN "("
739739
PARTITION_ITEM
740740
CALL_EXPR
@@ -769,7 +769,7 @@ SOURCE_FILE
769769
NAME_REF
770770
IDENT "sales_table"
771771
WHITESPACE " "
772-
INDEX_PARAMS
772+
PARTITION_ITEM_LIST
773773
L_PAREN "("
774774
PARTITION_ITEM
775775
NAME_REF

0 commit comments

Comments
 (0)