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::file::InFile;
6
7mod add_explicit_alias;
8mod add_schema;
9mod convert_comment;
10mod quote_identifier;
11mod remove_else_clause;
12mod remove_redundant_alias;
13mod rewrite_as_dollar_quoted_string;
14mod rewrite_as_regular_string;
15mod rewrite_at_local_as_timezone;
16mod rewrite_at_time_zone_as_timezone;
17mod rewrite_between_as_binary_expression;
18mod rewrite_cast_to_double_colon;
19mod rewrite_collation_for_as_function_call;
20mod rewrite_create_table_as_as_select_into;
21mod rewrite_double_colon_to_cast;
22mod rewrite_extract_as_function_call;
23mod rewrite_from;
24mod rewrite_in_as_expression;
25mod rewrite_integer_radix;
26mod rewrite_is_normalized_as_function_call;
27mod rewrite_leading_from;
28mod rewrite_normalize_as_function_call;
29mod rewrite_not_equals_operator;
30mod rewrite_overlaps_as_function_call;
31mod rewrite_overlay_as_function_call;
32mod rewrite_pattern_matching_as_operators;
33mod rewrite_position_as_function_call;
34mod rewrite_rows_from_as_unnest;
35mod rewrite_select_as_table;
36mod rewrite_select_as_values;
37mod rewrite_select_into_as_create_table_as;
38mod rewrite_substring_as_function_call;
39mod rewrite_system_user_as_function_call;
40mod rewrite_table_as_select;
41mod rewrite_timestamp_type;
42mod rewrite_trim_as_function_call;
43mod rewrite_unnest_as_rows_from;
44mod rewrite_values_as_select;
45mod rewrite_xmlexists_as_function_call;
46mod unnest;
47mod unquote_identifier;
48
49#[cfg(test)]
50mod test_utils;
51
52use add_explicit_alias::add_explicit_alias;
53use add_schema::add_schema;
54use convert_comment::convert_comment;
55use quote_identifier::quote_identifier;
56use remove_else_clause::remove_else_clause;
57use remove_redundant_alias::remove_redundant_alias;
58use rewrite_as_dollar_quoted_string::rewrite_as_dollar_quoted_string;
59use rewrite_as_regular_string::rewrite_as_regular_string;
60use rewrite_at_local_as_timezone::rewrite_at_local_as_timezone;
61use rewrite_at_time_zone_as_timezone::rewrite_at_time_zone_as_timezone;
62use rewrite_between_as_binary_expression::rewrite_between_as_binary_expression;
63use rewrite_cast_to_double_colon::rewrite_cast_to_double_colon;
64use rewrite_collation_for_as_function_call::rewrite_collation_for_as_function_call;
65use rewrite_create_table_as_as_select_into::rewrite_create_table_as_as_select_into;
66use rewrite_double_colon_to_cast::rewrite_double_colon_to_cast;
67use rewrite_extract_as_function_call::rewrite_extract_as_function_call;
68use rewrite_from::rewrite_from;
69use rewrite_in_as_expression::rewrite_in_as_expression;
70use rewrite_integer_radix::rewrite_integer_radix;
71use rewrite_is_normalized_as_function_call::rewrite_is_normalized_as_function_call;
72use rewrite_leading_from::rewrite_leading_from;
73use rewrite_normalize_as_function_call::rewrite_normalize_as_function_call;
74use rewrite_not_equals_operator::rewrite_not_equals_operator;
75use rewrite_overlaps_as_function_call::rewrite_overlaps_as_function_call;
76use rewrite_overlay_as_function_call::rewrite_overlay_as_function_call;
77use rewrite_pattern_matching_as_operators::rewrite_pattern_matching_as_operators;
78use rewrite_position_as_function_call::rewrite_position_as_function_call;
79use rewrite_rows_from_as_unnest::rewrite_rows_from_as_unnest;
80use rewrite_select_as_table::rewrite_select_as_table;
81use rewrite_select_as_values::rewrite_select_as_values;
82use rewrite_select_into_as_create_table_as::rewrite_select_into_as_create_table_as;
83use rewrite_substring_as_function_call::rewrite_substring_as_function_call;
84use rewrite_system_user_as_function_call::rewrite_system_user_as_function_call;
85use rewrite_table_as_select::rewrite_table_as_select;
86use rewrite_timestamp_type::rewrite_timestamp_type;
87use rewrite_trim_as_function_call::rewrite_trim_as_function_call;
88use rewrite_unnest_as_rows_from::rewrite_unnest_as_rows_from;
89use rewrite_values_as_select::rewrite_values_as_select;
90use rewrite_xmlexists_as_function_call::rewrite_xmlexists_as_function_call;
91use unquote_identifier::unquote_identifier;
92
93#[derive(Debug, Clone, PartialEq, Eq)]
94pub enum ActionKind {
95    QuickFix,
96    RefactorRewrite,
97}
98
99#[derive(Debug, Clone, PartialEq, Eq)]
100pub struct CodeAction {
101    pub title: String,
102    pub edits: Vec<Edit>,
103    pub kind: ActionKind,
104}
105
106pub fn code_actions(db: &dyn Db, position: InFile<TextSize>) -> Option<Vec<CodeAction>> {
107    let mut actions = vec![];
108    convert_comment(db, position, &mut actions);
109    rewrite_as_regular_string(db, position, &mut actions);
110    rewrite_as_dollar_quoted_string(db, position, &mut actions);
111    remove_else_clause(db, position, &mut actions);
112    rewrite_table_as_select(db, position, &mut actions);
113    rewrite_select_as_table(db, position, &mut actions);
114    rewrite_from(db, position, &mut actions);
115    rewrite_integer_radix(db, position, &mut actions);
116    rewrite_leading_from(db, position, &mut actions);
117    rewrite_values_as_select(db, position, &mut actions);
118    rewrite_select_as_values(db, position, &mut actions);
119    rewrite_select_into_as_create_table_as(db, position, &mut actions);
120    rewrite_create_table_as_as_select_into(db, position, &mut actions);
121    add_schema(db, position, &mut actions);
122    quote_identifier(db, position, &mut actions);
123    unquote_identifier(db, position, &mut actions);
124    add_explicit_alias(db, position, &mut actions);
125    remove_redundant_alias(db, position, &mut actions);
126    rewrite_cast_to_double_colon(db, position, &mut actions);
127    rewrite_double_colon_to_cast(db, position, &mut actions);
128    rewrite_between_as_binary_expression(db, position, &mut actions);
129    rewrite_not_equals_operator(db, position, &mut actions);
130    rewrite_timestamp_type(db, position, &mut actions);
131    rewrite_unnest_as_rows_from(db, position, &mut actions);
132    rewrite_rows_from_as_unnest(db, position, &mut actions);
133    rewrite_at_time_zone_as_timezone(db, position, &mut actions);
134    rewrite_at_local_as_timezone(db, position, &mut actions);
135    rewrite_overlaps_as_function_call(db, position, &mut actions);
136    rewrite_extract_as_function_call(db, position, &mut actions);
137    rewrite_is_normalized_as_function_call(db, position, &mut actions);
138    rewrite_collation_for_as_function_call(db, position, &mut actions);
139    rewrite_normalize_as_function_call(db, position, &mut actions);
140    rewrite_overlay_as_function_call(db, position, &mut actions);
141    rewrite_position_as_function_call(db, position, &mut actions);
142    rewrite_substring_as_function_call(db, position, &mut actions);
143    rewrite_trim_as_function_call(db, position, &mut actions);
144    rewrite_system_user_as_function_call(db, position, &mut actions);
145    rewrite_xmlexists_as_function_call(db, position, &mut actions);
146    rewrite_in_as_expression(db, position, &mut actions);
147    rewrite_pattern_matching_as_operators(db, position, &mut actions);
148    Some(actions)
149}