Skip to content

Commit 36d0e46

Browse files
authored
parser: add syntax node ptr & update grammar (#729)
1 parent 9724678 commit 36d0e46

File tree

12 files changed

+412
-200
lines changed

12 files changed

+412
-200
lines changed

crates/squawk_ide/src/expand_selection.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const DELIMITED_LIST_KINDS: &[SyntaxKind] = &[
3737
SyntaxKind::ALTER_OPTION_LIST,
3838
SyntaxKind::ARG_LIST,
3939
SyntaxKind::ATTRIBUTE_LIST,
40+
SyntaxKind::BEGIN_FUNC_OPTION_LIST,
4041
SyntaxKind::COLUMN_LIST,
4142
SyntaxKind::CONFLICT_INDEX_ITEM_LIST,
4243
SyntaxKind::CONSTRAINT_EXCLUSION_LIST,
@@ -60,6 +61,7 @@ const DELIMITED_LIST_KINDS: &[SyntaxKind] = &[
6061
SyntaxKind::SET_EXPR_LIST,
6162
SyntaxKind::SET_OPTIONS_LIST,
6263
SyntaxKind::SORT_BY_LIST,
64+
SyntaxKind::TABLE_AND_COLUMNS_LIST,
6365
SyntaxKind::TABLE_ARG_LIST,
6466
SyntaxKind::TABLE_LIST,
6567
SyntaxKind::TARGET_LIST,

crates/squawk_parser/src/generated/syntax_kind.rs

Lines changed: 3 additions & 0 deletions
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: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8173,7 +8173,7 @@ fn analyze(p: &mut Parser<'_>) -> CompletedMarker {
81738173
if !p.eat(VERBOSE_KW) {
81748174
opt_option_list(p);
81758175
}
8176-
opt_relation_list(p);
8176+
opt_table_and_columns_list(p);
81778177
m.complete(p, ANALYZE)
81788178
}
81798179

@@ -11691,7 +11691,7 @@ fn vacuum(p: &mut Parser<'_>) -> CompletedMarker {
1169111691
// [ ANALYZE ]
1169211692
let _ = p.eat(ANALYZE_KW) || p.eat(ANALYSE_KW);
1169311693
opt_vacuum_option_list(p);
11694-
opt_relation_list(p);
11694+
opt_table_and_columns_list(p);
1169511695
m.complete(p, VACUUM)
1169611696
}
1169711697

@@ -11715,16 +11715,29 @@ fn opt_vacuum_option_list(p: &mut Parser<'_>) {
1171511715
// [ table_and_columns [, ...] ]
1171611716
// where table_and_coumns is:
1171711717
// table_name [ ( column_name [, ...] ) ]
11718-
fn opt_relation_list(p: &mut Parser<'_>) {
11718+
fn opt_table_and_columns_list(p: &mut Parser<'_>) {
11719+
let m = p.start();
1171911720
while !p.at(EOF) {
11720-
if opt_relation_name(p).is_none() {
11721-
break;
11721+
if !opt_table_and_columns(p) {
11722+
m.abandon(p);
11723+
return;
1172211724
}
11723-
opt_column_list(p);
1172411725
if !p.eat(COMMA) {
1172511726
break;
1172611727
}
1172711728
}
11729+
m.complete(p, TABLE_AND_COLUMNS_LIST);
11730+
}
11731+
11732+
fn opt_table_and_columns(p: &mut Parser<'_>) -> bool {
11733+
let m = p.start();
11734+
if opt_relation_name(p).is_none() {
11735+
m.abandon(p);
11736+
return false;
11737+
}
11738+
opt_column_list(p);
11739+
m.complete(p, TABLE_AND_COLUMNS);
11740+
true
1172811741
}
1172911742

1173011743
const VACUUM_OPTION_FIRST: TokenSet = NON_RESERVED_WORD
@@ -13194,20 +13207,13 @@ fn opt_function_option(p: &mut Parser<'_>) -> bool {
1319413207
if p.eat(SEMICOLON) {
1319513208
continue;
1319613209
}
13197-
// sql standard
13198-
if p.eat(RETURN_KW) {
13199-
if expr(p).is_none() {
13200-
p.error("expected expr")
13201-
}
13202-
} else {
13203-
stmt(p, &StmtRestrictions::default());
13204-
}
13210+
begin_func_option(p);
1320513211
if p.at(END_KW) {
1320613212
p.expect(SEMICOLON);
1320713213
}
1320813214
}
1320913215
p.expect(END_KW);
13210-
BEGIN_FUNC_OPTION
13216+
BEGIN_FUNC_OPTION_LIST
1321113217
}
1321213218
_ => {
1321313219
m.abandon(p);
@@ -13218,6 +13224,21 @@ fn opt_function_option(p: &mut Parser<'_>) -> bool {
1321813224
true
1321913225
}
1322013226

13227+
fn begin_func_option(p: &mut Parser<'_>) {
13228+
let m = p.start();
13229+
if p.at(RETURN_KW) {
13230+
let m = p.start();
13231+
p.bump(RETURN_KW);
13232+
if expr(p).is_none() {
13233+
p.error("expected expr")
13234+
}
13235+
m.complete(p, RETURN_FUNC_OPTION);
13236+
} else {
13237+
stmt(p, &StmtRestrictions::default());
13238+
}
13239+
m.complete(p, BEGIN_FUNC_OPTION);
13240+
}
13241+
1322113242
// SET configuration_parameter { TO | = } { value | DEFAULT }
1322213243
// SET configuration_parameter FROM CURRENT
1322313244
fn set_configuration_param(p: &mut Parser<'_>) {

crates/squawk_parser/tests/snapshots/tests__analyze_ok.snap

Lines changed: 72 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -20,51 +20,55 @@ SOURCE_FILE
2020
WHITESPACE " "
2121
VERBOSE_KW "verbose"
2222
WHITESPACE " "
23-
RELATION_NAME
24-
PATH
25-
PATH
26-
PATH_SEGMENT
27-
NAME_REF
28-
IDENT "foo"
29-
DOT "."
30-
PATH_SEGMENT
31-
NAME_REF
32-
IDENT "bar"
33-
COMMA ","
34-
WHITESPACE " "
35-
RELATION_NAME
36-
PATH
37-
PATH
38-
PATH_SEGMENT
39-
NAME_REF
40-
IDENT "foo"
41-
DOT "."
42-
PATH_SEGMENT
43-
NAME_REF
44-
IDENT "bar"
45-
COLUMN_LIST
46-
L_PAREN "("
47-
COLUMN
48-
NAME_REF
49-
IDENT "a"
23+
TABLE_AND_COLUMNS_LIST
24+
TABLE_AND_COLUMNS
25+
RELATION_NAME
26+
PATH
27+
PATH
28+
PATH_SEGMENT
29+
NAME_REF
30+
IDENT "foo"
31+
DOT "."
32+
PATH_SEGMENT
33+
NAME_REF
34+
IDENT "bar"
5035
COMMA ","
5136
WHITESPACE " "
52-
COLUMN
53-
NAME_REF
54-
IDENT "b"
37+
TABLE_AND_COLUMNS
38+
RELATION_NAME
39+
PATH
40+
PATH
41+
PATH_SEGMENT
42+
NAME_REF
43+
IDENT "foo"
44+
DOT "."
45+
PATH_SEGMENT
46+
NAME_REF
47+
IDENT "bar"
48+
COLUMN_LIST
49+
L_PAREN "("
50+
COLUMN
51+
NAME_REF
52+
IDENT "a"
53+
COMMA ","
54+
WHITESPACE " "
55+
COLUMN
56+
NAME_REF
57+
IDENT "b"
58+
COMMA ","
59+
WHITESPACE " "
60+
COLUMN
61+
NAME_REF
62+
IDENT "c"
63+
R_PAREN ")"
5564
COMMA ","
5665
WHITESPACE " "
57-
COLUMN
58-
NAME_REF
59-
IDENT "c"
60-
R_PAREN ")"
61-
COMMA ","
62-
WHITESPACE " "
63-
RELATION_NAME
64-
PATH
65-
PATH_SEGMENT
66-
NAME_REF
67-
IDENT "foo"
66+
TABLE_AND_COLUMNS
67+
RELATION_NAME
68+
PATH
69+
PATH_SEGMENT
70+
NAME_REF
71+
IDENT "foo"
6872
SEMICOLON ";"
6973
WHITESPACE "\n\n"
7074
COMMENT "-- full_parens"
@@ -92,31 +96,33 @@ SOURCE_FILE
9296
INT_NUMBER "10"
9397
R_PAREN ")"
9498
WHITESPACE " "
95-
RELATION_NAME
96-
PATH
97-
PATH
98-
PATH_SEGMENT
99+
TABLE_AND_COLUMNS_LIST
100+
TABLE_AND_COLUMNS
101+
RELATION_NAME
102+
PATH
103+
PATH
104+
PATH_SEGMENT
105+
NAME_REF
106+
IDENT "foo"
107+
DOT "."
108+
PATH_SEGMENT
109+
NAME_REF
110+
IDENT "bar"
111+
COLUMN_LIST
112+
L_PAREN "("
113+
COLUMN
99114
NAME_REF
100-
IDENT "foo"
101-
DOT "."
102-
PATH_SEGMENT
103-
NAME_REF
104-
IDENT "bar"
105-
COLUMN_LIST
106-
L_PAREN "("
107-
COLUMN
108-
NAME_REF
109-
IDENT "a"
110-
COMMA ","
111-
WHITESPACE " "
112-
COLUMN
113-
NAME_REF
114-
IDENT "b"
115-
COMMA ","
116-
WHITESPACE " "
117-
COLUMN
118-
NAME_REF
119-
IDENT "c"
120-
R_PAREN ")"
115+
IDENT "a"
116+
COMMA ","
117+
WHITESPACE " "
118+
COLUMN
119+
NAME_REF
120+
IDENT "b"
121+
COMMA ","
122+
WHITESPACE " "
123+
COLUMN
124+
NAME_REF
125+
IDENT "c"
126+
R_PAREN ")"
121127
SEMICOLON ";"
122128
WHITESPACE "\n\n"

crates/squawk_parser/tests/snapshots/tests__create_function_ok.snap

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,29 +1783,31 @@ SOURCE_FILE
17831783
WHITESPACE " "
17841784
SQL_KW "sql"
17851785
WHITESPACE "\n"
1786-
BEGIN_FUNC_OPTION
1786+
BEGIN_FUNC_OPTION_LIST
17871787
BEGIN_KW "begin"
17881788
WHITESPACE " "
17891789
ATOMIC_KW "atomic"
17901790
WHITESPACE "\n "
1791-
SELECT
1792-
SELECT_CLAUSE
1793-
SELECT_KW "select"
1794-
WHITESPACE " "
1795-
TARGET_LIST
1796-
TARGET
1797-
LITERAL
1798-
INT_NUMBER "1"
1791+
BEGIN_FUNC_OPTION
1792+
SELECT
1793+
SELECT_CLAUSE
1794+
SELECT_KW "select"
1795+
WHITESPACE " "
1796+
TARGET_LIST
1797+
TARGET
1798+
LITERAL
1799+
INT_NUMBER "1"
17991800
SEMICOLON ";"
18001801
WHITESPACE "\n "
1801-
SELECT
1802-
SELECT_CLAUSE
1803-
SELECT_KW "select"
1804-
WHITESPACE " "
1805-
TARGET_LIST
1806-
TARGET
1807-
LITERAL
1808-
INT_NUMBER "2"
1802+
BEGIN_FUNC_OPTION
1803+
SELECT
1804+
SELECT_CLAUSE
1805+
SELECT_KW "select"
1806+
WHITESPACE " "
1807+
TARGET_LIST
1808+
TARGET
1809+
LITERAL
1810+
INT_NUMBER "2"
18091811
SEMICOLON ";"
18101812
WHITESPACE "\n"
18111813
END_KW "end"
@@ -1839,19 +1841,20 @@ SOURCE_FILE
18391841
WHITESPACE " "
18401842
SQL_KW "sql"
18411843
WHITESPACE "\n"
1842-
BEGIN_FUNC_OPTION
1844+
BEGIN_FUNC_OPTION_LIST
18431845
BEGIN_KW "begin"
18441846
WHITESPACE " "
18451847
ATOMIC_KW "atomic"
18461848
WHITESPACE "\n "
1847-
SELECT
1848-
SELECT_CLAUSE
1849-
SELECT_KW "select"
1850-
WHITESPACE " "
1851-
TARGET_LIST
1852-
TARGET
1853-
LITERAL
1854-
INT_NUMBER "1"
1849+
BEGIN_FUNC_OPTION
1850+
SELECT
1851+
SELECT_CLAUSE
1852+
SELECT_KW "select"
1853+
WHITESPACE " "
1854+
TARGET_LIST
1855+
TARGET
1856+
LITERAL
1857+
INT_NUMBER "1"
18551858
SEMICOLON ";"
18561859
WHITESPACE "\n "
18571860
END_KW "end"
@@ -1891,7 +1894,7 @@ SOURCE_FILE
18911894
WHITESPACE " "
18921895
SQL_KW "sql"
18931896
WHITESPACE "\n"
1894-
BEGIN_FUNC_OPTION
1897+
BEGIN_FUNC_OPTION_LIST
18951898
BEGIN_KW "begin"
18961899
WHITESPACE " "
18971900
ATOMIC_KW "atomic"
@@ -1904,14 +1907,15 @@ SOURCE_FILE
19041907
WHITESPACE "\n"
19051908
SEMICOLON ";"
19061909
WHITESPACE "\n "
1907-
SELECT
1908-
SELECT_CLAUSE
1909-
SELECT_KW "select"
1910-
WHITESPACE " "
1911-
TARGET_LIST
1912-
TARGET
1913-
LITERAL
1914-
INT_NUMBER "1"
1910+
BEGIN_FUNC_OPTION
1911+
SELECT
1912+
SELECT_CLAUSE
1913+
SELECT_KW "select"
1914+
WHITESPACE " "
1915+
TARGET_LIST
1916+
TARGET
1917+
LITERAL
1918+
INT_NUMBER "1"
19151919
SEMICOLON ";"
19161920
WHITESPACE "\n"
19171921
SEMICOLON ";"

0 commit comments

Comments
 (0)