@@ -63,7 +63,7 @@ pub fn infer_index_expr(
6363
6464fn infer_member_by_member_key (
6565 db : & DbIndex ,
66- config : & LuaInferConfig ,
66+ config : & mut LuaInferConfig ,
6767 prefix_type : & LuaType ,
6868 member_key : & LuaIndexKey ,
6969 infer_guard : & mut InferGuard ,
@@ -96,7 +96,7 @@ fn infer_member_by_member_key(
9696 infer_member_by_member_key ( db, config, & inner_type, member_key, infer_guard)
9797 }
9898 LuaType :: Tuple ( tuple_type) => infer_tuple_member ( tuple_type, member_key) ,
99- LuaType :: Object ( object_type) => infer_object_member ( object_type, member_key) ,
99+ LuaType :: Object ( object_type) => infer_object_member ( db , config , object_type, member_key) ,
100100 LuaType :: Union ( union_type) => infer_union_member ( db, config, union_type, member_key) ,
101101 LuaType :: Intersection ( intersection_type) => {
102102 infer_intersection_member ( db, config, intersection_type, member_key)
@@ -129,7 +129,7 @@ fn infer_table_member(
129129
130130fn infer_custom_type_member (
131131 db : & DbIndex ,
132- config : & LuaInferConfig ,
132+ config : & mut LuaInferConfig ,
133133 prefix_type_id : LuaTypeDeclId ,
134134 member_key : & LuaIndexKey ,
135135 infer_guard : & mut InferGuard ,
@@ -188,14 +188,52 @@ fn infer_tuple_member(tuple_type: &LuaTupleType, member_key: &LuaIndexKey) -> In
188188 None
189189}
190190
191- fn infer_object_member ( object_type : & LuaObjectType , member_key : & LuaIndexKey ) -> InferResult {
192- let member_type = object_type. get_field ( & member_key. into ( ) ) ?;
193- Some ( member_type. clone ( ) )
191+ fn infer_object_member (
192+ db : & DbIndex ,
193+ config : & mut LuaInferConfig ,
194+ object_type : & LuaObjectType ,
195+ member_key : & LuaIndexKey ,
196+ ) -> InferResult {
197+ if let Some ( member_type) = object_type. get_field ( & member_key. into ( ) ) {
198+ return Some ( member_type. clone ( ) ) ;
199+ }
200+
201+ let index_accesses = object_type. get_index_access ( ) ;
202+ for ( key, value) in index_accesses {
203+ if key. is_string ( ) {
204+ if member_key. is_string ( ) || member_key. is_name ( ) {
205+ return Some ( value. clone ( ) ) ;
206+ } else if member_key. is_expr ( ) {
207+ let expr = member_key. get_expr ( ) ?;
208+ let expr_type = infer_expr ( db, config, expr. clone ( ) ) ?;
209+ if expr_type. is_string ( ) {
210+ return Some ( value. clone ( ) ) ;
211+ }
212+ }
213+ } else if key. is_number ( ) {
214+ if member_key. is_integer ( ) {
215+ return Some ( value. clone ( ) ) ;
216+ } else if member_key. is_expr ( ) {
217+ let expr = member_key. get_expr ( ) ?;
218+ let expr_type = infer_expr ( db, config, expr. clone ( ) ) ?;
219+ if expr_type. is_number ( ) {
220+ return Some ( value. clone ( ) ) ;
221+ }
222+ }
223+ } else if let Some ( expr) = member_key. get_expr ( ) {
224+ let expr_type = infer_expr ( db, config, expr. clone ( ) ) ?;
225+ if expr_type == * key {
226+ return Some ( value. clone ( ) ) ;
227+ }
228+ }
229+ }
230+
231+ None
194232}
195233
196234fn infer_union_member (
197235 db : & DbIndex ,
198- config : & LuaInferConfig ,
236+ config : & mut LuaInferConfig ,
199237 union_type : & LuaUnionType ,
200238 member_key : & LuaIndexKey ,
201239) -> InferResult {
@@ -221,7 +259,7 @@ fn infer_union_member(
221259
222260fn infer_intersection_member (
223261 db : & DbIndex ,
224- config : & LuaInferConfig ,
262+ config : & mut LuaInferConfig ,
225263 intersection_type : & LuaIntersectionType ,
226264 member_key : & LuaIndexKey ,
227265) -> InferResult {
@@ -241,7 +279,7 @@ fn infer_intersection_member(
241279
242280fn infer_generic_member (
243281 db : & DbIndex ,
244- config : & LuaInferConfig ,
282+ config : & mut LuaInferConfig ,
245283 generic_type : & LuaGenericType ,
246284 member_key : & LuaIndexKey ,
247285) -> InferResult {
@@ -255,7 +293,7 @@ fn infer_generic_member(
255293
256294fn infer_exit_field_member (
257295 db : & DbIndex ,
258- config : & LuaInferConfig ,
296+ config : & mut LuaInferConfig ,
259297 exist_field : & LuaExistFieldType ,
260298 member_key : & LuaIndexKey ,
261299) -> InferResult {
@@ -277,7 +315,7 @@ fn infer_exit_field_member(
277315
278316fn infer_instance_member (
279317 db : & DbIndex ,
280- config : & LuaInferConfig ,
318+ config : & mut LuaInferConfig ,
281319 inst : & LuaInstanceType ,
282320 member_key : & LuaIndexKey ,
283321 infer_guard : & mut InferGuard ,
@@ -733,9 +771,11 @@ fn infer_namespace_member(
733771
734772 let namespace_or_type_id = format ! ( "{}.{}" , ns, member_key) ;
735773 let type_id = LuaTypeDeclId :: new ( & namespace_or_type_id) ;
736- if db. get_type_index ( ) . get_type_decl ( & type_id) . is_some ( ) {
774+ if db. get_type_index ( ) . get_type_decl ( & type_id) . is_some ( ) {
737775 return Some ( LuaType :: Def ( type_id) ) ;
738776 }
739777
740- return Some ( LuaType :: Namespace ( SmolStr :: new ( namespace_or_type_id) . into ( ) ) ) ;
741- }
778+ return Some ( LuaType :: Namespace (
779+ SmolStr :: new ( namespace_or_type_id) . into ( ) ,
780+ ) ) ;
781+ }
0 commit comments