Skip to content

Commit d9acd00

Browse files
authored
ide: cleanup hovering names (#1088)
1 parent 0f2d7e3 commit d9acd00

2 files changed

Lines changed: 82 additions & 204 deletions

File tree

crates/squawk_ide/src/classify.rs

Lines changed: 0 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -760,130 +760,6 @@ pub(crate) fn classify_name_ref(node: &SyntaxNode) -> Option<NameRefClass> {
760760
None
761761
}
762762

763-
#[derive(Debug)]
764-
pub(crate) enum NameClass {
765-
ColumnDefinition {
766-
create_table: ast::CreateTableLike,
767-
column: ast::Column,
768-
},
769-
CreateTable(ast::CreateTableLike),
770-
WithTable(ast::WithTable),
771-
CreateIndex(ast::CreateIndex),
772-
CreateSequence(ast::CreateSequence),
773-
CreateTrigger(ast::CreateTrigger),
774-
CreateEventTrigger(ast::CreateEventTrigger),
775-
CreateTablespace(ast::CreateTablespace),
776-
CreateDatabase(ast::CreateDatabase),
777-
CreateServer(ast::CreateServer),
778-
CreateExtension(ast::CreateExtension),
779-
CreateRole(ast::CreateRole),
780-
CreateType(ast::CreateType),
781-
CreateFunction(ast::CreateFunction),
782-
CreateAggregate(ast::CreateAggregate),
783-
CreateProcedure(ast::CreateProcedure),
784-
CreateSchema(ast::CreateSchema),
785-
ViewColumnList {
786-
create_view: ast::CreateView,
787-
name: ast::Name,
788-
},
789-
CreateView(ast::CreateView),
790-
CreatePropertyGraph(ast::CreatePropertyGraph),
791-
DeclareCursor(ast::Declare),
792-
PrepareStatement(ast::Prepare),
793-
Listen(ast::Listen),
794-
}
795-
796-
pub(crate) fn classify_name(name: &ast::Name) -> Option<NameClass> {
797-
let parent = name.syntax().parent();
798-
let column_parent = parent.clone().and_then(ast::Column::cast);
799-
let with_table_parent = parent.and_then(ast::WithTable::cast);
800-
let mut has_column_list = false;
801-
802-
for ancestor in name.syntax().ancestors() {
803-
if !has_column_list && ast::ColumnList::can_cast(ancestor.kind()) {
804-
has_column_list = true;
805-
}
806-
if let Some(create_table) = ast::CreateTableLike::cast(ancestor.clone()) {
807-
if let Some(column) = column_parent {
808-
return Some(NameClass::ColumnDefinition {
809-
create_table,
810-
column,
811-
});
812-
}
813-
return Some(NameClass::CreateTable(create_table));
814-
}
815-
if let Some(create_index) = ast::CreateIndex::cast(ancestor.clone()) {
816-
return Some(NameClass::CreateIndex(create_index));
817-
}
818-
if let Some(create_sequence) = ast::CreateSequence::cast(ancestor.clone()) {
819-
return Some(NameClass::CreateSequence(create_sequence));
820-
}
821-
if let Some(create_trigger) = ast::CreateTrigger::cast(ancestor.clone()) {
822-
return Some(NameClass::CreateTrigger(create_trigger));
823-
}
824-
if let Some(create_event_trigger) = ast::CreateEventTrigger::cast(ancestor.clone()) {
825-
return Some(NameClass::CreateEventTrigger(create_event_trigger));
826-
}
827-
if let Some(create_tablespace) = ast::CreateTablespace::cast(ancestor.clone()) {
828-
return Some(NameClass::CreateTablespace(create_tablespace));
829-
}
830-
if let Some(create_database) = ast::CreateDatabase::cast(ancestor.clone()) {
831-
return Some(NameClass::CreateDatabase(create_database));
832-
}
833-
if let Some(create_server) = ast::CreateServer::cast(ancestor.clone()) {
834-
return Some(NameClass::CreateServer(create_server));
835-
}
836-
if let Some(create_extension) = ast::CreateExtension::cast(ancestor.clone()) {
837-
return Some(NameClass::CreateExtension(create_extension));
838-
}
839-
if let Some(create_role) = ast::CreateRole::cast(ancestor.clone()) {
840-
return Some(NameClass::CreateRole(create_role));
841-
}
842-
if let Some(create_type) = ast::CreateType::cast(ancestor.clone()) {
843-
return Some(NameClass::CreateType(create_type));
844-
}
845-
if let Some(create_function) = ast::CreateFunction::cast(ancestor.clone()) {
846-
return Some(NameClass::CreateFunction(create_function));
847-
}
848-
if let Some(create_aggregate) = ast::CreateAggregate::cast(ancestor.clone()) {
849-
return Some(NameClass::CreateAggregate(create_aggregate));
850-
}
851-
if let Some(create_procedure) = ast::CreateProcedure::cast(ancestor.clone()) {
852-
return Some(NameClass::CreateProcedure(create_procedure));
853-
}
854-
if let Some(create_schema) = ast::CreateSchema::cast(ancestor.clone()) {
855-
return Some(NameClass::CreateSchema(create_schema));
856-
}
857-
if let Some(create_view) = ast::CreateView::cast(ancestor.clone()) {
858-
if has_column_list {
859-
return Some(NameClass::ViewColumnList {
860-
create_view,
861-
name: name.clone(),
862-
});
863-
}
864-
return Some(NameClass::CreateView(create_view));
865-
}
866-
if let Some(create_property_graph) = ast::CreatePropertyGraph::cast(ancestor.clone()) {
867-
return Some(NameClass::CreatePropertyGraph(create_property_graph));
868-
}
869-
if let Some(declare) = ast::Declare::cast(ancestor.clone()) {
870-
return Some(NameClass::DeclareCursor(declare));
871-
}
872-
if let Some(prepare) = ast::Prepare::cast(ancestor.clone()) {
873-
return Some(NameClass::PrepareStatement(prepare));
874-
}
875-
if let Some(listen) = ast::Listen::cast(ancestor.clone()) {
876-
return Some(NameClass::Listen(listen));
877-
}
878-
}
879-
880-
if let Some(with_table) = with_table_parent {
881-
return Some(NameClass::WithTable(with_table));
882-
}
883-
884-
None
885-
}
886-
887763
pub(crate) fn classify_def_node(def_node: &SyntaxNode) -> Option<LocationKind> {
888764
let mut in_column = false;
889765
let mut in_column_list = false;

crates/squawk_ide/src/hover.rs

Lines changed: 82 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::ast_nav;
22
use crate::builtins::builtins_file;
3-
use crate::classify::{NameClass, classify_name};
43
use crate::collect;
54
use crate::column_name::ColumnName;
65
use crate::comments::preceding_comment;
@@ -114,81 +113,69 @@ pub fn hover(db: &dyn Db, file: File, offset: TextSize) -> Option<Hover> {
114113
rowan::NodeOrToken::Token(token) => token.parent()?,
115114
rowan::NodeOrToken::Node(node) => node,
116115
};
117-
return hover_name_ref(db, def.file, &name_ref, def.kind, &def_node);
116+
return hover_name_ref(db, def.file, name_ref, def.kind, &def_node);
118117
}
119118

120119
if let Some(name) = ast::Name::cast(parent) {
121-
let context = classify_name(&name)?;
122-
match context {
123-
NameClass::ColumnDefinition {
124-
create_table,
125-
column,
126-
} => return hover_column_definition(db, file, create_table, column),
127-
NameClass::CreateTable(create_table) => {
128-
return format_create_table(db, file, create_table);
129-
}
130-
NameClass::WithTable(with_table) => return format_with_table(with_table),
131-
NameClass::CreateIndex(create_index) => {
132-
return format_create_index(db, file, create_index);
133-
}
134-
NameClass::CreateSequence(create_sequence) => {
135-
return format_create_sequence(db, file, create_sequence);
136-
}
137-
NameClass::CreateTrigger(create_trigger) => {
138-
return format_create_trigger(db, file, create_trigger);
139-
}
140-
NameClass::CreateEventTrigger(create_event_trigger) => {
141-
return format_create_event_trigger(create_event_trigger);
142-
}
143-
NameClass::CreateTablespace(create_tablespace) => {
144-
return format_create_tablespace(create_tablespace);
145-
}
146-
NameClass::CreateDatabase(create_database) => {
147-
return format_create_database(create_database);
148-
}
149-
NameClass::CreateServer(create_server) => {
150-
return format_create_server(create_server);
151-
}
152-
NameClass::CreateExtension(create_extension) => {
153-
return format_create_extension(create_extension);
154-
}
155-
NameClass::CreateRole(create_role) => {
156-
return format_create_role(create_role);
157-
}
158-
NameClass::CreateType(create_type) => {
159-
return format_create_type(db, file, create_type);
160-
}
161-
NameClass::CreateFunction(create_function) => {
162-
return format_create_function(db, file, create_function);
163-
}
164-
NameClass::CreateAggregate(create_aggregate) => {
165-
return format_create_aggregate(db, file, create_aggregate);
166-
}
167-
NameClass::CreateProcedure(create_procedure) => {
168-
return format_create_procedure(db, file, create_procedure);
169-
}
170-
NameClass::CreateSchema(create_schema) => {
171-
return format_create_schema(create_schema);
172-
}
173-
NameClass::ViewColumnList { create_view, name } => {
174-
return format_view_column(db, file, create_view, Name::from_node(&name));
175-
}
176-
NameClass::CreateView(create_view) => {
177-
return format_create_view(db, file, create_view);
178-
}
179-
NameClass::CreatePropertyGraph(create_property_graph) => {
180-
return format_create_property_graph(db, file, create_property_graph);
181-
}
182-
NameClass::DeclareCursor(declare) => {
183-
return format_declare_cursor(declare);
184-
}
185-
NameClass::PrepareStatement(prepare) => {
186-
return format_prepare(prepare);
187-
}
188-
NameClass::Listen(listen) => {
189-
return format_listen(listen);
120+
return hover_name(db, file, name);
121+
}
122+
123+
None
124+
}
125+
126+
fn hover_name(db: &dyn Db, file: File, name: ast::Name) -> Option<Hover> {
127+
let def_node = name.syntax();
128+
match LocationKind::from_node(def_node)? {
129+
LocationKind::Aggregate => hover_aggregate(db, file, def_node),
130+
LocationKind::CaseExpr | LocationKind::CommitBegin | LocationKind::CommitEnd => None,
131+
LocationKind::Channel => hover_channel(def_node),
132+
LocationKind::Column => hover_name_column(db, file, def_node),
133+
LocationKind::Cursor => hover_cursor(def_node),
134+
LocationKind::Database => hover_database(def_node),
135+
LocationKind::EventTrigger => hover_event_trigger(def_node),
136+
LocationKind::Extension => hover_extension(def_node),
137+
LocationKind::Function => hover_function(db, file, def_node),
138+
LocationKind::Index => hover_index(db, file, def_node),
139+
LocationKind::NamedArgParameter => hover_named_arg_parameter(db, file, def_node),
140+
LocationKind::Policy => hover_policy(db, file, def_node),
141+
LocationKind::PreparedStatement => hover_prepared_statement(def_node),
142+
LocationKind::Procedure => hover_procedure(db, file, def_node),
143+
LocationKind::PropertyGraph => hover_property_graph(db, file, def_node),
144+
LocationKind::Role => hover_role(def_node),
145+
LocationKind::Schema => hover_schema(def_node),
146+
LocationKind::Sequence => hover_sequence(db, file, def_node),
147+
LocationKind::Server => hover_server(def_node),
148+
LocationKind::Table => hover_table(db, file, def_node),
149+
LocationKind::Tablespace => hover_tablespace(def_node),
150+
LocationKind::View => {
151+
if let Some(hover) = format_create_view(db, file, def_node) {
152+
return Some(hover);
190153
}
154+
hover_table(db, file, def_node)
191155
}
156+
LocationKind::Trigger => hover_trigger(db, file, def_node),
157+
LocationKind::Type => hover_type(db, file, def_node),
158+
LocationKind::Window => hover_window(def_node),
159+
}
160+
}
161+
162+
fn hover_name_column(db: &dyn Db, file: File, def_node: &SyntaxNode) -> Option<Hover> {
163+
if let Some(result) = hover_composite_type_field(db, file, def_node) {
164+
return Some(result);
165+
}
166+
167+
if let Some(column) = def_node.parent().and_then(ast::Column::cast)
168+
&& let Some(create_table) = def_node.ancestors().find_map(ast::CreateTableLike::cast)
169+
{
170+
return hover_column_definition(db, file, create_table, column);
171+
}
172+
173+
if def_node
174+
.ancestors()
175+
.any(|ancestor| ast::ColumnList::can_cast(ancestor.kind()))
176+
&& let Some(create_view) = def_node.ancestors().find_map(ast::CreateView::cast)
177+
{
178+
return format_view_column(db, file, create_view, def_node);
192179
}
193180

194181
None
@@ -197,7 +184,7 @@ pub fn hover(db: &dyn Db, file: File, offset: TextSize) -> Option<Hover> {
197184
fn hover_name_ref(
198185
db: &dyn Db,
199186
file: File,
200-
name_ref: &ast::NameRef,
187+
name_ref: ast::NameRef,
201188
context: LocationKind,
202189
def_node: &SyntaxNode,
203190
) -> Option<Hover> {
@@ -280,8 +267,8 @@ impl ColumnHover {
280267
}
281268
}
282269

283-
fn hover_column(db: &dyn Db, file: File, name_ref: &ast::NameRef) -> Option<Hover> {
284-
let column_ptrs = resolve::resolve_name_ref_ptrs(db, file, name_ref)?;
270+
fn hover_column(db: &dyn Db, file: File, name_ref: ast::NameRef) -> Option<Hover> {
271+
let column_ptrs = resolve::resolve_name_ref_ptrs(db, file, &name_ref)?;
285272

286273
let results: Vec<Hover> = column_ptrs
287274
.into_iter()
@@ -844,10 +831,10 @@ fn hover_subquery_target_column(
844831
}
845832

846833
let result = match target.expr()? {
847-
ast::Expr::NameRef(name_ref) => hover_column(db, file, &name_ref),
834+
ast::Expr::NameRef(name_ref) => hover_column(db, file, name_ref),
848835
ast::Expr::FieldExpr(field_expr) => {
849836
let field = field_expr.field()?;
850-
hover_column(db, file, &field)
837+
hover_column(db, file, field)
851838
}
852839
_ => None,
853840
};
@@ -901,22 +888,37 @@ fn hover_event_trigger(def_node: &SyntaxNode) -> Option<Hover> {
901888
}
902889

903890
fn hover_tablespace(def_node: &SyntaxNode) -> Option<Hover> {
891+
if let Some(create_tablespace) = def_node.ancestors().find_map(ast::CreateTablespace::cast) {
892+
return format_create_tablespace(create_tablespace);
893+
}
904894
Some(Hover::snippet(format!("tablespace {}", def_node.text())))
905895
}
906896

907897
fn hover_database(def_node: &SyntaxNode) -> Option<Hover> {
898+
if let Some(create_database) = def_node.ancestors().find_map(ast::CreateDatabase::cast) {
899+
return format_create_database(create_database);
900+
}
908901
Some(Hover::snippet(format!("database {}", def_node.text())))
909902
}
910903

911904
fn hover_server(def_node: &SyntaxNode) -> Option<Hover> {
905+
if let Some(create_server) = def_node.ancestors().find_map(ast::CreateServer::cast) {
906+
return format_create_server(create_server);
907+
}
912908
Some(Hover::snippet(format!("server {}", def_node.text())))
913909
}
914910

915911
fn hover_extension(def_node: &SyntaxNode) -> Option<Hover> {
912+
if let Some(create_extension) = def_node.ancestors().find_map(ast::CreateExtension::cast) {
913+
return format_create_extension(create_extension);
914+
}
916915
Some(Hover::snippet(format!("extension {}", def_node.text())))
917916
}
918917

919918
fn hover_role(def_node: &SyntaxNode) -> Option<Hover> {
919+
if let Some(create_role) = def_node.ancestors().find_map(ast::CreateRole::cast) {
920+
return format_create_role(create_role);
921+
}
920922
Some(Hover::snippet(format!("role {}", def_node.text())))
921923
}
922924

@@ -1009,8 +1011,8 @@ fn format_create_table_as(
10091011
)))
10101012
}
10111013

1012-
fn format_create_view(db: &dyn Db, file: File, create_view: ast::CreateView) -> Option<Hover> {
1013-
let create_view = ast::CreateViewLike::cast(create_view.syntax().clone())?;
1014+
fn format_create_view(db: &dyn Db, file: File, def_node: &SyntaxNode) -> Option<Hover> {
1015+
let create_view = ast::CreateViewLike::cast(def_node.clone())?;
10141016
format_create_view_like(db, file, create_view)
10151017
}
10161018

@@ -1048,14 +1050,14 @@ fn format_view_column(
10481050
db: &dyn Db,
10491051
file: File,
10501052
create_view: ast::CreateView,
1051-
column_name: Name,
1053+
def_node: &SyntaxNode,
10521054
) -> Option<Hover> {
10531055
let path = create_view.path()?;
10541056
let (schema, view_name) = resolve::resolve_view_info(db, file, &path)?;
10551057
Some(Hover::snippet(ColumnHover::schema_table_column(
10561058
&schema.to_string(),
10571059
&view_name,
1058-
&column_name.to_string(),
1060+
&def_node.to_string(),
10591061
)))
10601062
}
10611063

0 commit comments

Comments
 (0)