Skip to main content

squawk_ide/code_actions/
mod.rs

1use rowan::TextSize;
2use salsa::Database as Db;
3use squawk_linter::Edit;
4
5use crate::db::File;
6
7mod add_explicit_alias;
8mod add_schema;
9mod quote_identifier;
10mod remove_else_clause;
11mod remove_redundant_alias;
12mod rewrite_as_dollar_quoted_string;
13mod rewrite_as_regular_string;
14mod rewrite_between_as_binary_expression;
15mod rewrite_cast_to_double_colon;
16mod rewrite_double_colon_to_cast;
17mod rewrite_from;
18mod rewrite_leading_from;
19mod rewrite_not_equals_operator;
20mod rewrite_select_as_table;
21mod rewrite_select_as_values;
22mod rewrite_table_as_select;
23mod rewrite_timestamp_type;
24mod rewrite_values_as_select;
25mod unquote_identifier;
26
27#[cfg(test)]
28mod test_utils;
29
30use add_explicit_alias::add_explicit_alias;
31use add_schema::add_schema;
32use quote_identifier::quote_identifier;
33use remove_else_clause::remove_else_clause;
34use remove_redundant_alias::remove_redundant_alias;
35use rewrite_as_dollar_quoted_string::rewrite_as_dollar_quoted_string;
36use rewrite_as_regular_string::rewrite_as_regular_string;
37use rewrite_between_as_binary_expression::rewrite_between_as_binary_expression;
38use rewrite_cast_to_double_colon::rewrite_cast_to_double_colon;
39use rewrite_double_colon_to_cast::rewrite_double_colon_to_cast;
40use rewrite_from::rewrite_from;
41use rewrite_leading_from::rewrite_leading_from;
42use rewrite_not_equals_operator::rewrite_not_equals_operator;
43use rewrite_select_as_table::rewrite_select_as_table;
44use rewrite_select_as_values::rewrite_select_as_values;
45use rewrite_table_as_select::rewrite_table_as_select;
46use rewrite_timestamp_type::rewrite_timestamp_type;
47use rewrite_values_as_select::rewrite_values_as_select;
48use unquote_identifier::unquote_identifier;
49
50#[derive(Debug, Clone, PartialEq, Eq)]
51pub enum ActionKind {
52    QuickFix,
53    RefactorRewrite,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq)]
57pub struct CodeAction {
58    pub title: String,
59    pub edits: Vec<Edit>,
60    pub kind: ActionKind,
61}
62
63#[salsa::tracked]
64pub fn code_actions(db: &dyn Db, file: File, offset: TextSize) -> Option<Vec<CodeAction>> {
65    let mut actions = vec![];
66    rewrite_as_regular_string(db, file, &mut actions, offset);
67    rewrite_as_dollar_quoted_string(db, file, &mut actions, offset);
68    remove_else_clause(db, file, &mut actions, offset);
69    rewrite_table_as_select(db, file, &mut actions, offset);
70    rewrite_select_as_table(db, file, &mut actions, offset);
71    rewrite_from(db, file, &mut actions, offset);
72    rewrite_leading_from(db, file, &mut actions, offset);
73    rewrite_values_as_select(db, file, &mut actions, offset);
74    rewrite_select_as_values(db, file, &mut actions, offset);
75    add_schema(db, file, &mut actions, offset);
76    quote_identifier(db, file, &mut actions, offset);
77    unquote_identifier(db, file, &mut actions, offset);
78    add_explicit_alias(db, file, &mut actions, offset);
79    remove_redundant_alias(db, file, &mut actions, offset);
80    rewrite_cast_to_double_colon(db, file, &mut actions, offset);
81    rewrite_double_colon_to_cast(db, file, &mut actions, offset);
82    rewrite_between_as_binary_expression(db, file, &mut actions, offset);
83    rewrite_not_equals_operator(db, file, &mut actions, offset);
84    rewrite_timestamp_type(db, file, &mut actions, offset);
85    Some(actions)
86}