Support unqualified lookup into extended interfaces from classes and impls (#7217)

When a class extends an interface, referring to a member name of the
interface as an unqualified name should refer to the class's
corresponding associated entity value, not to the associated entity
itself. Similarly, in an `impl`, unqualified names of associated
entities should refer to the `impl`'s corresponding value for that
entity.

To support this, we treat `impl`s as `extend`ing their implemented facet
type, and we make lookups into an extended facet type use the `Self`
type of the extending `impl` or `class` if lookup finds an associated
entity. We already did the latter if the extending entity was an
interface; this extends the existing support for these other cases.
This commit is contained in:
Richard Smith
2026-05-19 18:01:54 +00:00
committed by GitHub
parent 0d7c4a99eb
commit ce080b3549
112 changed files with 962 additions and 4125 deletions
+6 -2
View File
@@ -41,9 +41,13 @@ auto StartClassDefinition(Context& context, SemIR::Class& class_info,
definition_id, SemIR::NameId::None, class_info.parent_scope_id);
// Introduce `Self`.
auto self_type_inst_id =
context.types().GetTypeInstId(class_info.self_type_id);
context.name_scopes().AddRequiredName(
class_info.scope_id, SemIR::NameId::SelfType,
context.types().GetTypeInstId(class_info.self_type_id));
class_info.scope_id, SemIR::NameId::SelfType, self_type_inst_id);
context.name_scopes()
.Get(class_info.scope_id)
.set_self_type_id(self_type_inst_id);
}
// Checks that the specified finished adapter definition is valid and builds and