@@ -110,39 +110,39 @@ fn build_decl_hover(
110110) -> Option < ( ) > {
111111 let decl = db. get_decl_index ( ) . get_decl ( & decl_id) ?;
112112
113- let mut owner_member = None ;
114- let mut owner_decl = None ;
113+ let mut origin_member = None ;
114+ let mut origin_decl = None ;
115115
116116 // 处理类型签名
117- if typ . is_function ( ) {
118- let property_owner = get_decl_owner ( builder. semantic_model , decl_id. clone ( ) ) ;
119- match property_owner {
117+ if is_function ( & typ ) {
118+ let origin_decl_id = get_function_decl_owner ( builder. semantic_model , decl_id. clone ( ) ) ;
119+ match origin_decl_id {
120120 Some ( LuaSemanticDeclId :: Member ( member_id) ) => {
121- owner_member = Some ( db. get_member_index ( ) . get_member ( & member_id) . unwrap ( ) ) ;
121+ origin_member = Some ( db. get_member_index ( ) . get_member ( & member_id) . unwrap ( ) ) ;
122122 }
123123 Some ( LuaSemanticDeclId :: LuaDecl ( decl_id) ) => {
124- owner_decl = Some ( db. get_decl_index ( ) . get_decl ( & decl_id) . unwrap ( ) ) ;
124+ origin_decl = Some ( db. get_decl_index ( ) . get_decl ( & decl_id) . unwrap ( ) ) ;
125125 }
126126 _ => { }
127127 }
128128 hover_function_type (
129129 builder,
130130 db,
131131 & typ,
132- owner_member ,
133- if let Some ( owner_decl) = owner_decl {
132+ origin_member ,
133+ if let Some ( owner_decl) = origin_decl {
134134 owner_decl. get_name ( )
135135 } else {
136136 decl. get_name ( )
137137 } ,
138- if let Some ( owner_decl) = owner_decl {
138+ if let Some ( owner_decl) = origin_decl {
139139 owner_decl. is_local ( )
140140 } else {
141141 decl. is_local ( )
142142 } ,
143143 ) ;
144144
145- builder. set_location_path ( owner_member ) ;
145+ builder. set_location_path ( origin_member ) ;
146146 } else if typ. is_const ( ) {
147147 let const_value = hover_const_type ( db, & typ) ;
148148 let prefix = if decl. is_local ( ) {
@@ -174,12 +174,13 @@ fn build_decl_hover(
174174 builder
175175 . add_description ( LuaSemanticDeclId :: LuaDecl ( decl_id) )
176176 . or_else ( || {
177- owner_member . and_then ( |m : & LuaMember | {
177+ origin_member . and_then ( |m : & LuaMember | {
178178 builder. add_description ( LuaSemanticDeclId :: Member ( m. get_id ( ) ) )
179179 } )
180180 } )
181181 . or_else ( || {
182- owner_decl. and_then ( |d| builder. add_description ( LuaSemanticDeclId :: LuaDecl ( d. get_id ( ) ) ) )
182+ origin_decl
183+ . and_then ( |d| builder. add_description ( LuaSemanticDeclId :: LuaDecl ( d. get_id ( ) ) ) )
183184 } ) ;
184185
185186 builder. add_signature_params_rets_description ( typ) ;
@@ -199,54 +200,44 @@ fn build_member_hover(
199200 _ => return None ,
200201 } ;
201202
202- let mut function_member = None ;
203- let mut owner_decl = None ;
204- if typ. is_function ( )
205- || match & typ {
206- LuaType :: Union ( union) => {
207- union. get_types ( ) . len ( ) > 1
208- && union
209- . get_types ( )
210- . iter ( )
211- . all ( |t| matches ! ( t, LuaType :: DocFunction ( _) ) )
212- }
213- _ => false ,
214- }
215- {
216- let property_owner = get_member_owner ( & builder. semantic_model , member_id) ;
217- match property_owner {
203+ let mut origin_function_member = None ;
204+ let mut origin_decl = None ;
205+ if is_function ( & typ) {
206+ let origin_decl_id = get_function_member_owner ( & builder. semantic_model , member_id) ;
207+ match origin_decl_id {
218208 Some ( LuaSemanticDeclId :: Member ( member_id) ) => {
219- function_member = Some ( db. get_member_index ( ) . get_member ( & member_id) . unwrap ( ) ) ;
209+ origin_function_member =
210+ Some ( db. get_member_index ( ) . get_member ( & member_id) . unwrap ( ) ) ;
220211 }
221212 Some ( LuaSemanticDeclId :: LuaDecl ( decl_id) ) => {
222- owner_decl = Some ( db. get_decl_index ( ) . get_decl ( & decl_id) . unwrap ( ) ) ;
213+ origin_decl = Some ( db. get_decl_index ( ) . get_decl ( & decl_id) . unwrap ( ) ) ;
223214 }
224215 _ => { }
225216 }
226217 hover_function_type (
227218 builder,
228219 db,
229220 & typ,
230- function_member . or_else ( || {
231- if owner_decl . is_none ( ) {
221+ origin_function_member . or_else ( || {
222+ if origin_decl . is_none ( ) {
232223 Some ( & member)
233224 } else {
234225 None
235226 }
236227 } ) ,
237- if let Some ( owner_decl) = owner_decl {
228+ if let Some ( owner_decl) = origin_decl {
238229 owner_decl. get_name ( )
239230 } else {
240231 & member_name
241232 } ,
242- if let Some ( owner_decl) = owner_decl {
233+ if let Some ( owner_decl) = origin_decl {
243234 owner_decl. is_local ( )
244235 } else {
245236 false
246237 } ,
247238 ) ;
248239
249- builder. set_location_path ( Some ( & function_member . as_ref ( ) . unwrap_or ( & member) ) ) ;
240+ builder. set_location_path ( Some ( & origin_function_member . as_ref ( ) . unwrap_or ( & member) ) ) ;
250241 } else if typ. is_const ( ) {
251242 let const_value = hover_const_type ( db, & typ) ;
252243 builder. set_type_description ( format ! ( "(field) {}: {}" , member_name, const_value) ) ;
@@ -265,7 +256,7 @@ fn build_member_hover(
265256 builder
266257 . add_description ( LuaSemanticDeclId :: Member ( member_id) )
267258 . or_else ( || {
268- function_member
259+ origin_function_member
269260 . and_then ( |m| builder. add_description ( LuaSemanticDeclId :: Member ( m. get_id ( ) ) ) )
270261 } ) ;
271262
@@ -355,7 +346,10 @@ pub fn add_signature_ret_description(
355346}
356347
357348// 获取`decl`可能的来源
358- fn get_decl_owner ( semantic_model : & SemanticModel , decl_id : LuaDeclId ) -> Option < LuaSemanticDeclId > {
349+ fn get_function_decl_owner (
350+ semantic_model : & SemanticModel ,
351+ decl_id : LuaDeclId ,
352+ ) -> Option < LuaSemanticDeclId > {
359353 let root = semantic_model
360354 . get_db ( )
361355 . get_vfs ( )
@@ -368,18 +362,17 @@ fn get_decl_owner(semantic_model: &SemanticModel, decl_id: LuaDeclId) -> Option<
368362 . get_value_syntax_id ( ) ?
369363 . to_node_from_root ( & root) ?;
370364 let semantic_decl = semantic_model. find_decl ( node. into ( ) , SemanticDeclLevel :: default ( ) ) ;
371- // 似乎在`get_property_owner_id`推断时就已递归处理了, 但还是再处理一次
372365 match semantic_decl {
373366 Some ( LuaSemanticDeclId :: Member ( member_id) ) => {
374- get_member_owner ( semantic_model, member_id) . or ( semantic_decl)
367+ get_function_member_owner ( semantic_model, member_id) . or ( semantic_decl)
375368 }
376369 Some ( LuaSemanticDeclId :: LuaDecl ( _) ) => semantic_decl,
377370 _ => None ,
378371 }
379372}
380373
381374// 获取`member_id`可能的来源
382- fn get_member_owner (
375+ fn get_function_member_owner (
383376 semantic_model : & SemanticModel ,
384377 member_id : LuaMemberId ,
385378) -> Option < LuaSemanticDeclId > {
@@ -480,3 +473,14 @@ pub fn get_hover_type(builder: &HoverBuilder, semantic_model: &SemanticModel) ->
480473
481474 None
482475}
476+
477+ fn is_function ( typ : & LuaType ) -> bool {
478+ typ. is_function ( )
479+ || match & typ {
480+ LuaType :: Union ( union) => union
481+ . get_types ( )
482+ . iter ( )
483+ . all ( |t| matches ! ( t, LuaType :: DocFunction ( _) ) ) ,
484+ _ => false ,
485+ }
486+ }
0 commit comments