1
- use emmylua_code_analysis:: { DbIndex , LuaMemberInfo , LuaMemberKey , LuaSemanticDeclId , LuaType } ;
1
+ use emmylua_code_analysis:: {
2
+ DbIndex , LuaMemberInfo , LuaMemberKey , LuaSemanticDeclId , LuaType , SemanticModel ,
3
+ } ;
2
4
use emmylua_parser:: {
3
5
LuaAssignStat , LuaAstNode , LuaAstToken , LuaFuncStat , LuaGeneralToken , LuaIndexExpr ,
4
6
LuaParenExpr , LuaTokenKind ,
5
7
} ;
6
8
use lsp_types:: CompletionItem ;
7
9
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,
11
16
} ;
12
17
13
18
use super :: {
@@ -316,7 +321,7 @@ fn try_add_alias_completion_item(
316
321
completion_item : & CompletionItem ,
317
322
label : & String ,
318
323
) -> 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) ?;
320
325
321
326
let mut alias_completion_item = completion_item. clone ( ) ;
322
327
alias_completion_item. label = alias_label;
@@ -337,21 +342,32 @@ fn try_add_alias_completion_item(
337
342
338
343
/// 从注释中提取索引成员的别名, 只处理整数成员.
339
344
/// 格式为`-- [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 ( ) ;
341
350
let LuaMemberKey :: Integer ( _) = member_info. key else {
342
351
return None ;
343
352
} ;
344
353
345
354
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 {
347
356
return None ;
348
357
} ;
349
358
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 ( ) ?;
355
371
356
372
// 只去掉左侧空白字符,保留右侧内容以支持后续文本
357
373
let left_trimmed = description. trim_start ( ) ;
0 commit comments