@@ -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+
210266fn array_tpl_pattern_match (
211267 db : & DbIndex ,
212268 cache : & mut LuaInferCache ,
0 commit comments