Skip to content

Commit 5da9a28

Browse files
committed
优化 check_field
1 parent 07dd48c commit 5da9a28

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

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

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::collections::HashSet;
22

33
use emmylua_parser::{LuaAst, LuaAstNode, LuaIndexExpr, LuaIndexKey, LuaVarExpr};
4-
use internment::ArcIntern;
54

65
use crate::{DiagnosticCode, InferFailReason, LuaMemberKey, LuaType, SemanticModel};
76

@@ -142,9 +141,18 @@ fn is_valid_member(
142141
return Some(());
143142
}
144143

145-
// 获取并验证 key_type
146-
let key_type = match index_key {
147-
LuaIndexKey::Expr(expr) => match semantic_model.infer_expr(expr.clone()) {
144+
match prefix_typ {
145+
LuaType::Global => return Some(()),
146+
LuaType::Array(typ) => {
147+
if typ.is_unknown() {
148+
return Some(());
149+
}
150+
}
151+
_ => {}
152+
}
153+
154+
let key_type = if let LuaIndexKey::Expr(expr) = index_key {
155+
match semantic_model.infer_expr(expr.clone()) {
148156
Ok(
149157
LuaType::Any
150158
| LuaType::Unknown
@@ -162,24 +170,14 @@ fn is_valid_member(
162170
Err(_) => {
163171
return None;
164172
}
165-
},
166-
LuaIndexKey::String(name) => LuaType::StringConst(ArcIntern::new(name.get_value().into())),
167-
LuaIndexKey::Integer(i) => LuaType::IntegerConst(i.get_int_value()),
168-
LuaIndexKey::Name(name) => {
169-
LuaType::StringConst(ArcIntern::new(name.get_name_text().into()))
170173
}
171-
LuaIndexKey::Idx(i) => LuaType::IntegerConst(i.clone() as i64),
174+
} else {
175+
return None;
172176
};
173177

174178
// 允许特定类型组合通过
175179
match (prefix_typ, &key_type) {
176-
(LuaType::Global, _) => return Some(()),
177180
(LuaType::Tuple(_), LuaType::Integer | LuaType::IntegerConst(_)) => return Some(()),
178-
(LuaType::Array(typ), _) => {
179-
if typ.is_unknown() {
180-
return Some(());
181-
}
182-
}
183181
(LuaType::Def(id), _) => {
184182
if let Some(decl) = semantic_model.get_db().get_type_index().get_type_decl(id) {
185183
if decl.is_class() {

0 commit comments

Comments
 (0)