11use crate :: ast_nav;
22use crate :: builtins:: builtins_file;
3- use crate :: classify:: { NameClass , classify_name} ;
43use crate :: collect;
54use crate :: column_name:: ColumnName ;
65use 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> {
197184fn 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
903890fn 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
907897fn 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
911904fn 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
915911fn 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
919918fn 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