diff --git a/crates/squawk_ide/src/classify.rs b/crates/squawk_ide/src/classify.rs index 56a55439..876396cc 100644 --- a/crates/squawk_ide/src/classify.rs +++ b/crates/squawk_ide/src/classify.rs @@ -91,7 +91,7 @@ fn is_special_fn(kind: SyntaxKind) -> bool { } pub(crate) fn classify_name_ref(name_ref: &ast::NameRef) -> Option { - let mut in_call_expr = false; + let mut in_function_name = false; let mut in_arg_list = false; let mut in_column_list = false; let mut in_where_clause = false; @@ -546,8 +546,7 @@ pub(crate) fn classify_name_ref(name_ref: &ast::NameRef) -> Option return Some(NameRefClass::Table); } if let Some(create_trigger) = ast::CreateTrigger::cast(ancestor.clone()) - && in_call_expr - && !in_arg_list + && in_function_name { if create_trigger.procedure_token().is_some() { return Some(NameRefClass::ProcedureCall); @@ -555,8 +554,7 @@ pub(crate) fn classify_name_ref(name_ref: &ast::NameRef) -> Option return Some(NameRefClass::FunctionCall); } if let Some(create_event_trigger) = ast::CreateEventTrigger::cast(ancestor.clone()) - && in_call_expr - && !in_arg_list + && in_function_name { if create_event_trigger.procedure_token().is_some() { return Some(NameRefClass::ProcedureCall); @@ -576,9 +574,11 @@ pub(crate) fn classify_name_ref(name_ref: &ast::NameRef) -> Option in_arg_list = true; } if ast::CallExpr::can_cast(ancestor.kind()) { - in_call_expr = true; + if !in_arg_list { + in_function_name = true; + } } - if ast::DefaultConstraint::can_cast(ancestor.kind()) && in_call_expr && !in_arg_list { + if ast::DefaultConstraint::can_cast(ancestor.kind()) && in_function_name { return Some(NameRefClass::FunctionCall); } if ast::OnClause::can_cast(ancestor.kind()) { @@ -588,7 +588,7 @@ pub(crate) fn classify_name_ref(name_ref: &ast::NameRef) -> Option in_from_clause = true; } if ast::Select::can_cast(ancestor.kind()) { - if in_call_expr && !in_arg_list && !in_special_sql_fn { + if in_function_name && !in_special_sql_fn { return Some(NameRefClass::SelectFunctionCall); } if in_from_clause && !in_on_clause { diff --git a/crates/squawk_ide/src/goto_definition.rs b/crates/squawk_ide/src/goto_definition.rs index 297f138e..98a85e4e 100644 --- a/crates/squawk_ide/src/goto_definition.rs +++ b/crates/squawk_ide/src/goto_definition.rs @@ -3621,6 +3621,23 @@ select a$0(t, 1) from t; ); } + #[test] + fn goto_function_call_nested() { + assert_snapshot!(goto(" +create function f() returns int8 + as 'select 1' + language sql; +select format('foo%d', f$0()); +"), @r" + ╭▸ + 2 │ create function f() returns int8 + │ ─ 2. destination + ‡ + 5 │ select format('foo%d', f()); + ╰╴ ─ 1. source + "); + } + #[test] fn goto_field_style_function_call() { assert_snapshot!(goto("