Skip to content

Commit ae50534

Browse files
committed
优化member_info搜索
1 parent 466b92f commit ae50534

File tree

6 files changed

+291
-126
lines changed

6 files changed

+291
-126
lines changed

crates/emmylua_code_analysis/src/diagnostic/checker/check_field.rs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -317,26 +317,41 @@ fn is_valid_member(
317317
}
318318
if members.is_empty() {
319319
// 当没有任何成员信息且是 enum 类型时, 需要检查参数是否为自己
320-
if let LuaType::Ref(id) | LuaType::Def(id) = prefix_type {
321-
if let Some(decl) = semantic_model.get_db().get_type_index().get_type_decl(&id)
322-
{
323-
if decl.is_enum() {
324-
if key_types.iter().any(|typ| match typ {
325-
LuaType::Ref(key_id) | LuaType::Def(key_id) => id == *key_id,
326-
_ => false,
327-
}) {
328-
return Some(());
329-
}
330-
}
331-
}
320+
if check_enum_self_reference(semantic_model, &prefix_type, &key_types).is_some() {
321+
return Some(());
332322
}
333323
}
324+
} else {
325+
if check_enum_self_reference(semantic_model, &prefix_type, &key_types).is_some() {
326+
return Some(());
327+
}
334328
}
335329
}
336330

337331
None
338332
}
339333

334+
/// 检查枚举类型的自引用
335+
fn check_enum_self_reference(
336+
semantic_model: &SemanticModel,
337+
prefix_type: &LuaType,
338+
key_types: &HashSet<LuaType>,
339+
) -> Option<()> {
340+
if let LuaType::Ref(id) | LuaType::Def(id) = prefix_type {
341+
if let Some(decl) = semantic_model.get_db().get_type_index().get_type_decl(&id) {
342+
if decl.is_enum() {
343+
if key_types.iter().any(|typ| match typ {
344+
LuaType::Ref(key_id) | LuaType::Def(key_id) => *id == *key_id,
345+
_ => false,
346+
}) {
347+
return Some(());
348+
}
349+
}
350+
}
351+
}
352+
None
353+
}
354+
340355
fn get_prefix_types(prefix_typ: &LuaType) -> HashSet<LuaType> {
341356
let mut type_set = HashSet::new();
342357
let mut stack = vec![prefix_typ.clone()];

0 commit comments

Comments
 (0)