From 809e3f214553d227e665f97c3fe6c76d95d11144 Mon Sep 17 00:00:00 2001 From: ShenzhenGopher Date: Thu, 11 Jun 2026 14:25:19 +0800 Subject: [PATCH] fix: prioritize explicit @field over inherited table index in infer_generic_member When a generic class inherits table (K=string), infer_generic_member calls infer_generic_members_from_super_generics before checking the type's own @field declarations. This causes string-keyed lookups to return V instead of the declared @field type, producing call-non-callable false positives. Move the explicit @field lookup before the super-generics check so that intentional field declarations always take precedence over inherited table index semantics. --- .../src/semantic/infer/infer_index/mod.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs b/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs index 1f3ad09ce..a6014fb96 100644 --- a/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs +++ b/crates/emmylua_code_analysis/src/semantic/infer/infer_index/mod.rs @@ -705,7 +705,16 @@ fn infer_generic_member( { return infer_member_by_lookup(db, cache, &origin_type, lookup, &infer_guard.fork()); } - + + // First, try to find the member directly on the type itself (explicit @field declarations). + // This ensures that explicit @field definitions take priority over inherited table index semantics. + let owner = LuaMemberOwner::Type(base_type_decl_id.clone()); + if let Some(member_item) = db.get_member_index().get_member_item(&owner, &lookup.key) { + if let Ok(member_type) = member_item.resolve_type(db) { + return Ok(instantiate_type_generic(db, &member_type, &substitutor)); + } + } + let result = infer_generic_members_from_super_generics( db, cache,