Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}
Comment on lines +711 to +716

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

If resolve_type fails (returns an Err), the current implementation silently ignores the error and falls back to infer_generic_members_from_super_generics. However, since the member is explicitly declared on the type itself, any resolution failure should be propagated rather than falling back to the parent's generic index semantics (which would re-introduce the exact overriding/shadowing issue this PR aims to fix).

Using the ? operator to propagate the error is consistent with how member resolution is handled in other parts of the codebase (e.g., infer_custom_type_member).

        let owner = LuaMemberOwner::Type(base_type_decl_id.clone());
        if let Some(member_item) = db.get_member_index().get_member_item(&owner, &lookup.key) {
            let 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,
Expand Down
Loading