Skip to content

Commit ff37b81

Browse files
committed
完善LuaType::Object泛型推断
1 parent f64daa5 commit ff37b81

1 file changed

Lines changed: 56 additions & 0 deletions

File tree

crates/emmylua_code_analysis/src/semantic/generic/tpl_pattern.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,67 @@ fn object_tpl_pattern_match(
202202
}
203203
}
204204
}
205+
LuaType::TableConst(inst) => {
206+
let owner = LuaMemberOwner::Element(inst.clone());
207+
object_tpl_pattern_match_member_owner_match(
208+
db,
209+
cache,
210+
root,
211+
origin_obj,
212+
owner,
213+
substitutor,
214+
);
215+
}
205216
_ => {}
206217
}
207218
Some(())
208219
}
209220

221+
fn object_tpl_pattern_match_member_owner_match(
222+
db: &DbIndex,
223+
cache: &mut LuaInferCache,
224+
root: &LuaSyntaxNode,
225+
object: &LuaObjectType,
226+
owner: LuaMemberOwner,
227+
substitutor: &mut TypeSubstitutor,
228+
) -> Option<()> {
229+
let owner_type = match &owner {
230+
LuaMemberOwner::Element(inst) => LuaType::TableConst(inst.clone()),
231+
LuaMemberOwner::Type(type_id) => LuaType::Ref(type_id.clone()),
232+
_ => {
233+
return None;
234+
}
235+
};
236+
237+
let members = infer_member_map(db, &owner_type)?;
238+
for (k, v) in members {
239+
let resolve_key = match &k {
240+
LuaMemberKey::Integer(i) => Some(LuaType::IntegerConst(i.clone())),
241+
LuaMemberKey::Name(s) => Some(LuaType::StringConst(s.clone().into())),
242+
_ => None,
243+
};
244+
let resolve_type = match v.len() {
245+
0 => LuaType::Any,
246+
1 => v[0].typ.clone(),
247+
_ => {
248+
let mut types = Vec::new();
249+
for m in v {
250+
types.push(m.typ.clone());
251+
}
252+
LuaType::Union(LuaUnionType::new(types).into())
253+
}
254+
};
255+
256+
if let Some(_) = resolve_key {
257+
if let Some(field_value) = object.get_field(&k) {
258+
tpl_pattern_match(db, cache, root, field_value, &resolve_type, substitutor);
259+
}
260+
}
261+
}
262+
263+
Some(())
264+
}
265+
210266
fn array_tpl_pattern_match(
211267
db: &DbIndex,
212268
cache: &mut LuaInferCache,

0 commit comments

Comments
 (0)