Skip to content

Commit bbcc33b

Browse files
committed
completion: 支持泛型实例重载显示
1 parent e1fca3b commit bbcc33b

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

crates/emmylua_code_analysis/src/semantic/member/infer_member_map.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ pub fn infer_member_map(
1717
for member in members {
1818
let key = member.key.clone();
1919
let typ = &member.typ;
20+
// 通常是泛型实例化推断结果
2021
if let LuaType::Union(u) = typ {
2122
if u.get_types().iter().all(|f| f.is_function()) {
22-
for f in u.get_types() {
23+
for (index, f) in u.get_types().iter().enumerate() {
2324
let new_member = LuaMemberInfo {
2425
key: key.clone(),
2526
typ: f.clone(),
2627
property_owner_id: member.property_owner_id.clone(),
2728
feature: member.feature.clone(),
29+
overload_index: Some(index),
2830
};
2931

3032
member_map

crates/emmylua_code_analysis/src/semantic/member/infer_members.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ fn infer_normal_members(db: &DbIndex, member_owner: LuaMemberOwner) -> InferMemb
6060
key: member.get_key().clone(),
6161
typ: member.get_decl_type(),
6262
feature: Some(member.get_feature()),
63+
overload_index: None,
6364
});
6465
}
6566

@@ -93,6 +94,7 @@ fn infer_custom_type_members(
9394
key: member.get_key().clone(),
9495
typ: member.get_decl_type(),
9596
feature: Some(member.get_feature()),
97+
overload_index: None,
9698
});
9799
}
98100
}
@@ -118,6 +120,7 @@ fn infer_tuple_members(tuple_type: &LuaTupleType) -> InferMembersResult {
118120
key: LuaMemberKey::Integer((idx + 1) as i64),
119121
typ: typ.clone(),
120122
feature: None,
123+
overload_index: None,
121124
});
122125
}
123126

@@ -132,6 +135,7 @@ fn infer_object_members(object_type: &LuaObjectType) -> InferMembersResult {
132135
key: key.clone(),
133136
typ: typ.clone(),
134137
feature: None,
138+
overload_index: None,
135139
});
136140
}
137141

@@ -189,6 +193,7 @@ fn infer_intersection_members(
189193
key,
190194
typ,
191195
feature: None,
196+
overload_index: None,
192197
});
193198
}
194199
}
@@ -225,6 +230,7 @@ fn infer_global_members(db: &DbIndex) -> InferMembersResult {
225230
key: LuaMemberKey::Name(decl.get_name().to_string().into()),
226231
typ: decl.get_type().cloned().unwrap_or(LuaType::Unknown),
227232
feature: None,
233+
overload_index: None,
228234
});
229235
}
230236

@@ -266,13 +272,15 @@ fn infer_namespace_members(db: &DbIndex, ns: &str) -> InferMembersResult {
266272
key: LuaMemberKey::Name(name.into()),
267273
typ,
268274
feature: None,
275+
overload_index: None,
269276
});
270277
} else {
271278
members.push(LuaMemberInfo {
272279
property_owner_id: None,
273280
key: LuaMemberKey::Name(name.clone().into()),
274281
typ: LuaType::Namespace(SmolStr::new(format!("{}.{}", ns, &name)).into()),
275282
feature: None,
283+
overload_index: None,
276284
});
277285
}
278286
}

crates/emmylua_code_analysis/src/semantic/member/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ pub struct LuaMemberInfo {
5050
pub key: LuaMemberKey,
5151
pub typ: LuaType,
5252
pub feature: Option<LuaMemberFeature>,
53+
pub overload_index: Option<usize>,
5354
}
5455

5556
type InferMembersResult = Option<Vec<LuaMemberInfo>>;

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ pub fn add_member_completion(
6060
return None;
6161
}
6262

63-
let data = if let Some(id) = &property_owner {
64-
CompletionData::from_property_owner_id(id.clone().into())
63+
let completion_data = if let Some(id) = &property_owner {
64+
if let Some(index) = member_info.overload_index {
65+
CompletionData::from_overload(id.clone().into(), index)
66+
} else {
67+
CompletionData::from_property_owner_id(id.clone().into())
68+
}
6569
} else {
6670
None
6771
};
@@ -80,7 +84,7 @@ pub fn add_member_completion(
8084
let mut completion_item = CompletionItem {
8185
label: label.clone(),
8286
kind: Some(get_completion_kind(&typ)),
83-
data,
87+
data: completion_data,
8488
label_details: Some(lsp_types::CompletionItemLabelDetails {
8589
detail,
8690
description,

0 commit comments

Comments
 (0)