1- use emmylua_code_analysis:: { DbIndex , LuaMemberInfo , LuaMemberKey , LuaSemanticDeclId , LuaType } ;
1+ use emmylua_code_analysis:: {
2+ DbIndex , LuaMemberInfo , LuaMemberKey , LuaSemanticDeclId , LuaType , SemanticModel ,
3+ } ;
24use emmylua_parser:: {
35 LuaAssignStat , LuaAstNode , LuaAstToken , LuaFuncStat , LuaGeneralToken , LuaIndexExpr ,
46 LuaParenExpr , LuaTokenKind ,
57} ;
68use lsp_types:: CompletionItem ;
79
8- use crate :: handlers:: completion:: {
9- completion_builder:: CompletionBuilder , completion_data:: CompletionData ,
10- providers:: get_function_remove_nil,
10+ use crate :: handlers:: {
11+ completion:: {
12+ completion_builder:: CompletionBuilder , completion_data:: CompletionData ,
13+ providers:: get_function_remove_nil,
14+ } ,
15+ hover:: try_extract_signature_id_from_field,
1116} ;
1217
1318use super :: {
@@ -316,7 +321,7 @@ fn try_add_alias_completion_item(
316321 completion_item : & CompletionItem ,
317322 label : & String ,
318323) -> Option < bool > {
319- let alias_label = extract_index_member_alias ( builder. semantic_model . get_db ( ) , member_info) ?;
324+ let alias_label = extract_index_member_alias ( & builder. semantic_model , member_info) ?;
320325
321326 let mut alias_completion_item = completion_item. clone ( ) ;
322327 alias_completion_item. label = alias_label;
@@ -337,21 +342,32 @@ fn try_add_alias_completion_item(
337342
338343/// 从注释中提取索引成员的别名, 只处理整数成员.
339344/// 格式为`-- [nameX]`.
340- pub fn extract_index_member_alias ( db : & DbIndex , member_info : & LuaMemberInfo ) -> Option < String > {
345+ pub fn extract_index_member_alias (
346+ semantic_model : & SemanticModel ,
347+ member_info : & LuaMemberInfo ,
348+ ) -> Option < String > {
349+ let db = semantic_model. get_db ( ) ;
341350 let LuaMemberKey :: Integer ( _) = member_info. key else {
342351 return None ;
343352 } ;
344353
345354 let property_owner_id = member_info. property_owner_id . as_ref ( ) ?;
346- let LuaSemanticDeclId :: Member ( _ ) = property_owner_id else {
355+ let LuaSemanticDeclId :: Member ( member_id ) = property_owner_id else {
347356 return None ;
348357 } ;
349358
350- let description = db
351- . get_property_index ( )
352- . get_property ( property_owner_id) ?
353- . description
354- . as_ref ( ) ?;
359+ let common_property = match db. get_property_index ( ) . get_property ( property_owner_id) {
360+ Some ( common_property) => common_property,
361+ None => {
362+ // field定义的`signature`的`common_property`绑定位置稍有不同, 需要特殊处理
363+ let member = db. get_member_index ( ) . get_member ( member_id) ?;
364+ let signature_id = try_extract_signature_id_from_field ( semantic_model, member) ?;
365+ db. get_property_index ( )
366+ . get_property ( & LuaSemanticDeclId :: Signature ( signature_id) ) ?
367+ }
368+ } ;
369+
370+ let description = common_property. description . as_ref ( ) ?;
355371
356372 // 只去掉左侧空白字符,保留右侧内容以支持后续文本
357373 let left_trimmed = description. trim_start ( ) ;
0 commit comments