From 338273c9e3c06af50d8edee292249d4725c3d113 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Sat, 11 Apr 2026 17:27:59 -0400 Subject: [PATCH 1/2] ide: goto def for user, current_user, session_user, & current_schema --- crates/squawk_ide/src/goto_definition.rs | 68 ++++++++++++++++++++++++ crates/squawk_ide/src/resolve.rs | 26 ++++----- s/lint | 4 +- 3 files changed, 85 insertions(+), 13 deletions(-) diff --git a/crates/squawk_ide/src/goto_definition.rs b/crates/squawk_ide/src/goto_definition.rs index 994ac25d..4d3e47f8 100644 --- a/crates/squawk_ide/src/goto_definition.rs +++ b/crates/squawk_ide/src/goto_definition.rs @@ -908,6 +908,74 @@ select current_timestamp$0; "); } + #[test] + fn goto_current_user() { + assert_snapshot!(goto(" +create function pg_catalog.current_user() returns name + language internal; +select current_user$0; +"), @" + ╭▸ + 2 │ create function pg_catalog.current_user() returns name + │ ──────────── 2. destination + 3 │ language internal; + 4 │ select current_user; + ╰╴ ─ 1. source + " + ); + } + + #[test] + fn goto_user_keyword() { + assert_snapshot!(goto(" +create function pg_catalog.current_user() returns name + language internal; +select user$0; +"), @" + ╭▸ + 2 │ create function pg_catalog.current_user() returns name + │ ──────────── 2. destination + 3 │ language internal; + 4 │ select user; + ╰╴ ─ 1. source + " + ); + } + + #[test] + fn goto_session_user() { + assert_snapshot!(goto(" +create function pg_catalog.session_user() returns name + language internal; +select session_user$0; +"), @" + ╭▸ + 2 │ create function pg_catalog.session_user() returns name + │ ──────────── 2. destination + 3 │ language internal; + 4 │ select session_user; + ╰╴ ─ 1. source + " + ); + } + + #[test] + fn goto_current_schema() { + assert_snapshot!(goto(" +create function current_schema() returns name + language internal; +select current_schema$0; +"), @" + ╭▸ + 2 │ create function current_schema() returns name + │ ────────────── 2. destination + 3 │ language internal; + 4 │ select current_schema; + ╰╴ ─ 1. source + " + ); + } + #[test] fn goto_current_timestamp_cte_column() { assert_snapshot!(goto(" diff --git a/crates/squawk_ide/src/resolve.rs b/crates/squawk_ide/src/resolve.rs index bfe18b03..439e08b0 100644 --- a/crates/squawk_ide/src/resolve.rs +++ b/crates/squawk_ide/src/resolve.rs @@ -500,7 +500,7 @@ pub(crate) fn resolve_name_ref_ptrs( .map(|ptr| smallvec![ptr]) } } - .or_else(|| resolve_current_timestamp_as_now(binder, name_ref)) + .or_else(|| resolve_special_keyword_as_function(binder, name_ref)) } fn resolve_table_name_ptr( @@ -725,22 +725,24 @@ fn resolve_for_kind_with_params( binder.lookup_with_params(name, kind, position, schema, params) } -/// `current_timestamp` is equivalent to `now()` -fn resolve_current_timestamp_as_now( +// some keywords behave as functions +fn resolve_special_keyword_as_function( binder: &Binder, name_ref: &ast::NameRef, ) -> Option> { - if name_ref + let function_name = name_ref .syntax() .first_child_or_token() - .is_some_and(|t| t.kind() == SyntaxKind::CURRENT_TIMESTAMP_KW) - { - let now_name = Name::from_string("now"); - let position = name_ref.syntax().text_range().start(); - return resolve_function(binder, &now_name, &None, None, position) - .map(|ptr| smallvec![ptr]); - } - None + .and_then(|t| match t.kind() { + SyntaxKind::CURRENT_SCHEMA_KW => Some("current_schema"), + SyntaxKind::CURRENT_TIMESTAMP_KW => Some("now"), + SyntaxKind::CURRENT_USER_KW | SyntaxKind::USER_KW => Some("current_user"), + SyntaxKind::SESSION_USER_KW => Some("session_user"), + _ => None, + })?; + let function_name = Name::from_string(function_name); + let position = name_ref.syntax().text_range().start(); + resolve_function(binder, &function_name, &None, None, position).map(|ptr| smallvec![ptr]) } fn resolve_function( diff --git a/s/lint b/s/lint index c48dcfba..69e407ce 100755 --- a/s/lint +++ b/s/lint @@ -3,9 +3,11 @@ set -e if [ -n "$CI" ]; then cargo fmt -- --check + ./s/oxfmt cargo clippy --all-targets --all-features -- -D warnings cargo check --locked else - cargo fmt + cargo fmt + ./s/oxfmt cargo clippy --fix --allow-staged --allow-dirty --all-targets --all-features -- -D warnings fi From 7d02ec96a51329af543e09ebf6ee67439e3a013e Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Sat, 11 Apr 2026 17:33:52 -0400 Subject: [PATCH 2/2] fix --- s/lint | 1 - 1 file changed, 1 deletion(-) diff --git a/s/lint b/s/lint index 69e407ce..8f70cffd 100755 --- a/s/lint +++ b/s/lint @@ -3,7 +3,6 @@ set -e if [ -n "$CI" ]; then cargo fmt -- --check - ./s/oxfmt cargo clippy --all-targets --all-features -- -D warnings cargo check --locked else