Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions crates/squawk_ide/src/goto_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5829,13 +5829,13 @@ select 1::smallint$0;
fn goto_cast_double_precision_falls_back_to_float8() {
assert_snapshot!(goto("
create type pg_catalog.float8;
select '1'::double precision[]$0;
select '1'::double precision[$0];
"), @r"
╭▸
2 │ create type pg_catalog.float8;
│ ────── 2. destination
3 │ select '1'::double precision[];
╰╴ ─ 1. source
╰╴ ─ 1. source
");
}

Expand Down
7 changes: 7 additions & 0 deletions crates/squawk_parser/src/generated/syntax_kind.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

83 changes: 61 additions & 22 deletions crates/squawk_parser/src/grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2149,16 +2149,25 @@ fn opt_percent_type(p: &mut Parser<'_>) -> Option<CompletedMarker> {
}
}

fn opt_array_index(p: &mut Parser<'_>) -> bool {
if p.eat(L_BRACK) {
if !p.at(R_BRACK) {
let _ = expr(p);
}
p.expect(R_BRACK);
true
} else {
false
fn opt_array_bound(p: &mut Parser<'_>) -> bool {
if !p.at(L_BRACK) {
return false;
}
let m = p.start();
p.bump(L_BRACK);
if !p.at(R_BRACK) {
let _ = expr(p);
}
p.expect(R_BRACK);
m.complete(p, ARRAY_BOUND);
true
}

fn allows_type_mods(kind: SyntaxKind) -> bool {
matches!(
kind,
PATH_TYPE | BIT_TYPE | BIT_VARYING_TYPE | CHARACTER_TYPE | VARCHAR_TYPE
)
}

fn type_mods(
Expand All @@ -2170,7 +2179,7 @@ fn type_mods(
if opt_percent_type(p).is_some() {
return Some(m.complete(p, PERCENT_TYPE));
}
if p.at(L_PAREN) && type_args_enabled {
if p.at(L_PAREN) && type_args_enabled && allows_type_mods(kind) {
let m = p.start();
delimited(
p,
Expand All @@ -2188,13 +2197,12 @@ fn type_mods(
return Some(cm);
}
let m = cm.precede(p);
// TODO: we should probably mimic the INDEX_EXPR but be stricter
if p.eat(ARRAY_KW) {
opt_array_index(p);
opt_array_bound(p);
} else {
let mut found_one_array_bracks = false;
while !p.at(EOF) && p.at(L_BRACK) {
if opt_array_index(p) {
if opt_array_bound(p) {
found_one_array_bracks = true;
}
}
Expand Down Expand Up @@ -2422,59 +2430,90 @@ fn interval_second(p: &mut Parser<'_>) {
}

fn opt_interval_trailing(p: &mut Parser<'_>) {
match (p.current(), p.nth(1)) {
let m = p.start();
let kind = match (p.current(), p.nth(1)) {
(DAY_KW, TO_KW) => {
p.bump(DAY_KW);
p.bump(TO_KW);
match p.current() {
HOUR_KW => {
p.bump(HOUR_KW);
INTERVAL_HOUR
}
MINUTE_KW => {
p.bump(MINUTE_KW);
INTERVAL_MINUTE
}
SECOND_KW => {
interval_second(p);
INTERVAL_SECOND
}
_ => {
p.error("expected HOUR, MINUTE, or SECOND");
INTERVAL_DAY
}
_ => p.error("expected HOUR, MINUTE, or SECOND"),
}
}
(DAY_KW, _) => p.bump(DAY_KW),
(DAY_KW, _) => {
p.bump(DAY_KW);
INTERVAL_DAY
}
(HOUR_KW, TO_KW) => {
p.bump(HOUR_KW);
p.bump(TO_KW);
if !p.eat(MINUTE_KW) {
if p.eat(MINUTE_KW) {
INTERVAL_MINUTE
} else {
interval_second(p);
INTERVAL_SECOND
}
}
(HOUR_KW, _) => p.bump(HOUR_KW),
(HOUR_KW, _) => {
p.bump(HOUR_KW);
INTERVAL_HOUR
}
(MINUTE_KW, TO_KW) => {
p.bump(MINUTE_KW);
p.bump(TO_KW);
interval_second(p);
INTERVAL_SECOND
}
(MINUTE_KW, _) => {
p.bump(MINUTE_KW);
INTERVAL_MINUTE
}
(MONTH_KW, _) => {
p.bump(MONTH_KW);
INTERVAL_MONTH
}
(MINUTE_KW, _) => p.bump(MINUTE_KW),
(MONTH_KW, _) => p.bump(MONTH_KW),
(YEAR_KW, TO_KW) => {
p.bump(YEAR_KW);
p.bump(TO_KW);
p.expect(MONTH_KW);
INTERVAL_MONTH
}
(YEAR_KW, _) => {
p.bump(YEAR_KW);
INTERVAL_YEAR
}
(SECOND_KW, _) => {
interval_second(p);
INTERVAL_SECOND
}
(L_PAREN, _) => {
p.bump(L_PAREN);
if opt_numeric_literal(p).is_none() {
p.error("expected number")
}
p.expect(R_PAREN);
INTERVAL_SECOND
}
_ => (),
}
_ => {
m.abandon(p);
return;
}
};
m.complete(p, kind);
}

fn name_ref_(p: &mut Parser<'_>) -> Option<CompletedMarker> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -448,8 +448,9 @@ SOURCE_FILE
PATH_REF
PATH_SEGMENT_REF
NUMERIC_KW "numeric"
L_BRACK "["
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
R_BRACK "]"
WHITESPACE "\n"
FUNC_OPTION_LIST
AS_FUNC_OPTION
Expand Down Expand Up @@ -3176,8 +3177,9 @@ SOURCE_FILE
PATH_REF
PATH_SEGMENT_REF
TEXT_KW "text"
L_BRACK "["
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
R_BRACK "]"
COMMA ","
WHITESPACE " "
PARAM
Expand Down Expand Up @@ -3253,8 +3255,9 @@ SOURCE_FILE
DOT "."
PATH_SEGMENT_REF
IDENT "u"
L_BRACK "["
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
R_BRACK "]"
COMMA ","
WHITESPACE " "
PARAM
Expand Down
42 changes: 24 additions & 18 deletions crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2750,8 +2750,9 @@ SOURCE_FILE
PATH_REF
PATH_SEGMENT_REF
INTEGER_KW "integer"
L_BRACK "["
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
R_BRACK "]"
COMMA ","
WHITESPACE "\n "
COLUMN
Expand All @@ -2763,10 +2764,12 @@ SOURCE_FILE
PATH_REF
PATH_SEGMENT_REF
TEXT_KW "text"
L_BRACK "["
R_BRACK "]"
L_BRACK "["
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
R_BRACK "]"
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
Expand Down Expand Up @@ -2795,14 +2798,16 @@ SOURCE_FILE
PATH_REF
PATH_SEGMENT_REF
INTEGER_KW "integer"
L_BRACK "["
LITERAL
INT_NUMBER "3"
R_BRACK "]"
L_BRACK "["
LITERAL
INT_NUMBER "3"
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
LITERAL
INT_NUMBER "3"
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
LITERAL
INT_NUMBER "3"
R_BRACK "]"
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
Expand Down Expand Up @@ -2833,10 +2838,11 @@ SOURCE_FILE
INTEGER_KW "integer"
WHITESPACE " "
ARRAY_KW "ARRAY"
L_BRACK "["
LITERAL
INT_NUMBER "4"
R_BRACK "]"
ARRAY_BOUND
L_BRACK "["
LITERAL
INT_NUMBER "4"
R_BRACK "]"
COMMA ","
WHITESPACE "\n "
COLUMN
Expand Down
Loading
Loading