mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Support for name lookup into interfaces. (#3729)
Follow the existing support for classes. None of this is especially useful until other features land: we don't yet have any use for defining methods of an interface out of line, because we don't support `default` or `final` interface methods, and we don't have impl lookup, so referring to an interface member is also not especially useful. But this is a nice piece to factor out that's a prerequisite for effectively testing other interface features.
This commit is contained in:
@@ -195,6 +195,21 @@ auto DeclNameStack::UpdateScopeIfNeeded(NameContext& name_context,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SemIR::InterfaceDecl::Kind: {
|
||||
const auto& interface_info = context_->interfaces().Get(
|
||||
resolved_inst.As<SemIR::InterfaceDecl>().interface_id);
|
||||
if (interface_info.is_defined()) {
|
||||
name_context.state = NameContext::State::Resolved;
|
||||
name_context.target_scope_id = interface_info.scope_id;
|
||||
if (!is_unqualified) {
|
||||
PushNameQualifierScope(*context_, name_context.resolved_inst_id,
|
||||
interface_info.scope_id);
|
||||
}
|
||||
} else {
|
||||
name_context.state = NameContext::State::ResolvedNonScope;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SemIR::Namespace::Kind: {
|
||||
auto scope_id = resolved_inst.As<SemIR::Namespace>().name_scope_id;
|
||||
name_context.state = NameContext::State::Resolved;
|
||||
@@ -234,9 +249,8 @@ auto DeclNameStack::TryResolveQualifier(NameContext& name_context,
|
||||
case NameContext::State::ResolvedNonScope: {
|
||||
// Because more qualifiers were found, we diagnose that the earlier
|
||||
// qualifier didn't resolve to a scoped entity.
|
||||
if (auto class_decl = context_->insts()
|
||||
.Get(name_context.resolved_inst_id)
|
||||
.TryAs<SemIR::ClassDecl>()) {
|
||||
if (auto class_decl = context_->insts().TryGetAs<SemIR::ClassDecl>(
|
||||
name_context.resolved_inst_id)) {
|
||||
CARBON_DIAGNOSTIC(QualifiedDeclInIncompleteClassScope, Error,
|
||||
"Cannot declare a member of incomplete class `{0}`.",
|
||||
SemIR::TypeId);
|
||||
@@ -245,6 +259,22 @@ auto DeclNameStack::TryResolveQualifier(NameContext& name_context,
|
||||
context_->classes().Get(class_decl->class_id).self_type_id);
|
||||
context_->NoteIncompleteClass(class_decl->class_id, builder);
|
||||
builder.Emit();
|
||||
} else if (auto interface_decl =
|
||||
context_->insts().TryGetAs<SemIR::InterfaceDecl>(
|
||||
name_context.resolved_inst_id)) {
|
||||
CARBON_DIAGNOSTIC(
|
||||
QualifiedDeclInUndefinedInterfaceScope, Error,
|
||||
"Cannot declare a member of undefined interface `{0}`.",
|
||||
std::string);
|
||||
auto builder = context_->emitter().Build(
|
||||
name_context.parse_node, QualifiedDeclInUndefinedInterfaceScope,
|
||||
context_->sem_ir().StringifyTypeExpr(
|
||||
context_->sem_ir()
|
||||
.constant_values()
|
||||
.Get(name_context.resolved_inst_id)
|
||||
.inst_id()));
|
||||
context_->NoteUndefinedInterface(interface_decl->interface_id, builder);
|
||||
builder.Emit();
|
||||
} else {
|
||||
CARBON_DIAGNOSTIC(QualifiedNameInNonScope, Error,
|
||||
"Name qualifiers are only allowed for entities that "
|
||||
|
||||
Reference in New Issue
Block a user