Skip to content

Commit 15f6f58

Browse files
authored
ide: goto def for user, current_user, session_user, & current_schema (#1056)
1 parent 1360632 commit 15f6f58

3 files changed

Lines changed: 84 additions & 13 deletions

File tree

crates/squawk_ide/src/goto_definition.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,74 @@ select current_timestamp$0;
908908
");
909909
}
910910

911+
#[test]
912+
fn goto_current_user() {
913+
assert_snapshot!(goto("
914+
create function pg_catalog.current_user() returns name
915+
language internal;
916+
select current_user$0;
917+
"), @"
918+
╭▸
919+
2 │ create function pg_catalog.current_user() returns name
920+
│ ──────────── 2. destination
921+
3 │ language internal;
922+
4 │ select current_user;
923+
╰╴ ─ 1. source
924+
"
925+
);
926+
}
927+
928+
#[test]
929+
fn goto_user_keyword() {
930+
assert_snapshot!(goto("
931+
create function pg_catalog.current_user() returns name
932+
language internal;
933+
select user$0;
934+
"), @"
935+
╭▸
936+
2 │ create function pg_catalog.current_user() returns name
937+
│ ──────────── 2. destination
938+
3 │ language internal;
939+
4 │ select user;
940+
╰╴ ─ 1. source
941+
"
942+
);
943+
}
944+
945+
#[test]
946+
fn goto_session_user() {
947+
assert_snapshot!(goto("
948+
create function pg_catalog.session_user() returns name
949+
language internal;
950+
select session_user$0;
951+
"), @"
952+
╭▸
953+
2 │ create function pg_catalog.session_user() returns name
954+
│ ──────────── 2. destination
955+
3 │ language internal;
956+
4 │ select session_user;
957+
╰╴ ─ 1. source
958+
"
959+
);
960+
}
961+
962+
#[test]
963+
fn goto_current_schema() {
964+
assert_snapshot!(goto("
965+
create function current_schema() returns name
966+
language internal;
967+
select current_schema$0;
968+
"), @"
969+
╭▸
970+
2 │ create function current_schema() returns name
971+
│ ────────────── 2. destination
972+
3 │ language internal;
973+
4 │ select current_schema;
974+
╰╴ ─ 1. source
975+
"
976+
);
977+
}
978+
911979
#[test]
912980
fn goto_current_timestamp_cte_column() {
913981
assert_snapshot!(goto("

crates/squawk_ide/src/resolve.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ pub(crate) fn resolve_name_ref_ptrs(
500500
.map(|ptr| smallvec![ptr])
501501
}
502502
}
503-
.or_else(|| resolve_current_timestamp_as_now(binder, name_ref))
503+
.or_else(|| resolve_special_keyword_as_function(binder, name_ref))
504504
}
505505

506506
fn resolve_table_name_ptr(
@@ -725,22 +725,24 @@ fn resolve_for_kind_with_params(
725725
binder.lookup_with_params(name, kind, position, schema, params)
726726
}
727727

728-
/// `current_timestamp` is equivalent to `now()`
729-
fn resolve_current_timestamp_as_now(
728+
// some keywords behave as functions
729+
fn resolve_special_keyword_as_function(
730730
binder: &Binder,
731731
name_ref: &ast::NameRef,
732732
) -> Option<SmallVec<[SyntaxNodePtr; 1]>> {
733-
if name_ref
733+
let function_name = name_ref
734734
.syntax()
735735
.first_child_or_token()
736-
.is_some_and(|t| t.kind() == SyntaxKind::CURRENT_TIMESTAMP_KW)
737-
{
738-
let now_name = Name::from_string("now");
739-
let position = name_ref.syntax().text_range().start();
740-
return resolve_function(binder, &now_name, &None, None, position)
741-
.map(|ptr| smallvec![ptr]);
742-
}
743-
None
736+
.and_then(|t| match t.kind() {
737+
SyntaxKind::CURRENT_SCHEMA_KW => Some("current_schema"),
738+
SyntaxKind::CURRENT_TIMESTAMP_KW => Some("now"),
739+
SyntaxKind::CURRENT_USER_KW | SyntaxKind::USER_KW => Some("current_user"),
740+
SyntaxKind::SESSION_USER_KW => Some("session_user"),
741+
_ => None,
742+
})?;
743+
let function_name = Name::from_string(function_name);
744+
let position = name_ref.syntax().text_range().start();
745+
resolve_function(binder, &function_name, &None, None, position).map(|ptr| smallvec![ptr])
744746
}
745747

746748
fn resolve_function(

s/lint

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ if [ -n "$CI" ]; then
66
cargo clippy --all-targets --all-features -- -D warnings
77
cargo check --locked
88
else
9-
cargo fmt
9+
cargo fmt
10+
./s/oxfmt
1011
cargo clippy --fix --allow-staged --allow-dirty --all-targets --all-features -- -D warnings
1112
fi

0 commit comments

Comments
 (0)