diff --git a/crates/squawk_ide/src/code_actions.rs b/crates/squawk_ide/src/code_actions.rs index 30cefb21..842adfe3 100644 --- a/crates/squawk_ide/src/code_actions.rs +++ b/crates/squawk_ide/src/code_actions.rs @@ -387,6 +387,12 @@ fn add_explicit_alias( return None; } + if let Some(ast::Expr::FieldExpr(field_expr)) = target.expr() + && field_expr.star_token().is_some() + { + return None; + } + let alias = ColumnName::from_target(target.clone()).and_then(|c| c.0.to_string())?; let expr_end = target.expr().map(|e| e.syntax().text_range().end())?; @@ -1513,6 +1519,14 @@ select myschema.f$0();" )); } + #[test] + fn add_explicit_alias_not_applicable_qualified_star() { + assert!(code_action_not_applicable( + add_explicit_alias, + "with t as (select 1 a) select t.*$0 from t;" + )); + } + #[test] fn add_explicit_alias_literal() { assert_snapshot!(apply_code_action( diff --git a/crates/squawk_ide/src/completion.rs b/crates/squawk_ide/src/completion.rs index f5db6413..183ab181 100644 --- a/crates/squawk_ide/src/completion.rs +++ b/crates/squawk_ide/src/completion.rs @@ -75,6 +75,15 @@ fn select_completions( && let Some(select) = ast::Select::cast(parent) && let Some(from_clause) = select.from_clause() { + completions.push(CompletionItem { + label: "*".to_string(), + kind: CompletionItemKind::Operator, + detail: None, + insert_text: None, + insert_text_format: None, + trigger_completion_after_insert: false, + sort_text: None, + }); for table_ptr in resolve::table_ptrs_from_clause(&binder, &from_clause) { let table_node = table_ptr.to_node(file.syntax()); match resolve::find_table_source(&table_node) { @@ -488,6 +497,7 @@ pub enum CompletionItemKind { Schema, Type, Snippet, + Operator, } impl CompletionItemKind { @@ -499,6 +509,7 @@ impl CompletionItemKind { Self::Type => "1", Self::Snippet => "1", Self::Function => "2", + Self::Operator => "8", Self::Schema => "9", } } @@ -696,6 +707,7 @@ select $0 from t; b | Column | int | t | Table | | f() | Function | public.f() returns text | + * | Operator | | public | Schema | | pg_catalog | Schema | | pg_temp | Schema | | @@ -710,9 +722,10 @@ select $0 from t; create table t (c int); select t.$0 from t; "), @r" - label | kind | detail | insert_text - -------+--------+--------+------------- - c | Column | int | + label | kind | detail | insert_text + -------+----------+--------+------------- + c | Column | int | + * | Operator | | "); } @@ -722,14 +735,15 @@ select t.$0 from t; with t as (select 1 a) select $0 from t; "), @r" - label | kind | detail | insert_text - --------------------+--------+---------+------------- - a | Column | integer | - public | Schema | | - pg_catalog | Schema | | - pg_temp | Schema | | - pg_toast | Schema | | - information_schema | Schema | | + label | kind | detail | insert_text + --------------------+----------+---------+------------- + a | Column | integer | + * | Operator | | + public | Schema | | + pg_catalog | Schema | | + pg_temp | Schema | | + pg_toast | Schema | | + information_schema | Schema | | "); } @@ -739,16 +753,17 @@ select $0 from t; with t as (values (1, 'foo', false)) select $0 from t; "), @r" - label | kind | detail | insert_text - --------------------+--------+---------+------------- - column1 | Column | integer | - column2 | Column | text | - column3 | Column | boolean | - public | Schema | | - pg_catalog | Schema | | - pg_temp | Schema | | - pg_toast | Schema | | - information_schema | Schema | | + label | kind | detail | insert_text + --------------------+----------+---------+------------- + column1 | Column | integer | + column2 | Column | text | + column3 | Column | boolean | + * | Operator | | + public | Schema | | + pg_catalog | Schema | | + pg_temp | Schema | | + pg_toast | Schema | | + information_schema | Schema | | "); } @@ -757,17 +772,18 @@ select $0 from t; assert_snapshot!(completions(" select $0 from (values (1, 'foo', 1.5, false)); "), @r" - label | kind | detail | insert_text - --------------------+--------+---------+------------- - column1 | Column | integer | - column2 | Column | text | - column3 | Column | numeric | - column4 | Column | boolean | - public | Schema | | - pg_catalog | Schema | | - pg_temp | Schema | | - pg_toast | Schema | | - information_schema | Schema | | + label | kind | detail | insert_text + --------------------+----------+---------+------------- + column1 | Column | integer | + column2 | Column | text | + column3 | Column | numeric | + column4 | Column | boolean | + * | Operator | | + public | Schema | | + pg_catalog | Schema | | + pg_temp | Schema | | + pg_toast | Schema | | + information_schema | Schema | | "); } diff --git a/crates/squawk_server/src/lsp_utils.rs b/crates/squawk_server/src/lsp_utils.rs index 20381891..d91007ac 100644 --- a/crates/squawk_server/src/lsp_utils.rs +++ b/crates/squawk_server/src/lsp_utils.rs @@ -88,6 +88,7 @@ pub(crate) fn completion_item( CompletionItemKind::Function => lsp_types::CompletionItemKind::FUNCTION, CompletionItemKind::Type => lsp_types::CompletionItemKind::CLASS, CompletionItemKind::Snippet => lsp_types::CompletionItemKind::SNIPPET, + CompletionItemKind::Operator => lsp_types::CompletionItemKind::OPERATOR, }; let sort_text = Some(item.sort_text()); diff --git a/crates/squawk_wasm/src/lib.rs b/crates/squawk_wasm/src/lib.rs index b4481208..d11b6925 100644 --- a/crates/squawk_wasm/src/lib.rs +++ b/crates/squawk_wasm/src/lib.rs @@ -553,6 +553,7 @@ pub fn completion(content: String, line: u32, col: u32) -> Result "schema", squawk_ide::completion::CompletionItemKind::Type => "type", squawk_ide::completion::CompletionItemKind::Snippet => "snippet", + squawk_ide::completion::CompletionItemKind::Operator => "operator", } .to_string(), detail: item.detail,