Skip to content

Commit 6ce2548

Browse files
committed
fix completion index field function
1 parent 1550377 commit 6ce2548

File tree

4 files changed

+53
-13
lines changed

4 files changed

+53
-13
lines changed

crates/emmylua_ls/src/handlers/completion/add_completions/add_member_completion.rs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
use emmylua_code_analysis::{DbIndex, LuaMemberInfo, LuaMemberKey, LuaSemanticDeclId, LuaType};
1+
use emmylua_code_analysis::{
2+
DbIndex, LuaMemberInfo, LuaMemberKey, LuaSemanticDeclId, LuaType, SemanticModel,
3+
};
24
use emmylua_parser::{
35
LuaAssignStat, LuaAstNode, LuaAstToken, LuaFuncStat, LuaGeneralToken, LuaIndexExpr,
46
LuaParenExpr, LuaTokenKind,
57
};
68
use 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

1318
use 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();

crates/emmylua_ls/src/handlers/hover/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use build_hover::build_semantic_info_hover;
1111
use emmylua_code_analysis::{EmmyLuaAnalysis, FileId};
1212
use emmylua_parser::LuaAstNode;
1313
pub use find_origin::{find_all_same_named_members, find_member_origin_owner};
14+
pub use function_humanize::try_extract_signature_id_from_field;
1415
pub use hover_builder::HoverBuilder;
1516
pub use hover_humanize::infer_prefix_global_name;
1617
use keyword_hover::{hover_keyword, is_keyword};

crates/emmylua_ls/src/handlers/inlay_hint/build_inlay_hint.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ fn build_index_expr_hint(
644644
let member_infos = semantic_model.get_member_info_with_key(&prefix_type, member_key, false)?;
645645
let member_info = member_infos.first()?;
646646
// 尝试提取别名
647-
let alias = extract_index_member_alias(semantic_model.get_db(), member_info)?;
647+
let alias = extract_index_member_alias(semantic_model, member_info)?;
648648
// 创建 hint
649649
let document = semantic_model.get_document();
650650
let position = {

crates/emmylua_ls/src/handlers/test/completion_test.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,4 +1144,27 @@ mod tests {
11441144
},],
11451145
));
11461146
}
1147+
1148+
#[test]
1149+
fn test_field_index_function() {
1150+
let mut ws = ProviderVirtualWorkspace::new();
1151+
ws.def(
1152+
r#"
1153+
---@class A<T>
1154+
---@field [1] fun() # [next]
1155+
A = {}
1156+
"#,
1157+
);
1158+
// 测试索引成员别名语法
1159+
assert!(ws.check_completion(
1160+
r#"
1161+
A.<??>
1162+
"#,
1163+
vec![VirtualCompletionItem {
1164+
label: "next".to_string(),
1165+
kind: CompletionItemKind::FUNCTION,
1166+
label_detail: Some("()".to_string()),
1167+
},],
1168+
));
1169+
}
11471170
}

0 commit comments

Comments
 (0)