Files
carbon-lang/toolchain/sem_ir/impl.cpp
T
Dana Jansens 0177dc5677 Import contained RequireImpls when importing an Interface or NamedConstraint (#6344)
When importing an Interface or NamedConstraint, walk the block of
`RequireImplsId`s, and for each one:
- Import the RequireImplsDecl from it, which also imports the
`RequireImpls` structure and its id.
- Collect those decls and build a block of `RequireImplsId`s for the
local SemIR to reference from the Interface or NamedConstraint.

The import of RequireImplsDecl is done in a single phase instead of
three, unlike other decls. This is possible since require declarations
have no name, so they can't be referenced by instructions inside them,
thus there's no cycles to concern ourselves with.
2025-11-14 14:31:11 +00:00

49 lines
1.8 KiB
C++

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "toolchain/sem_ir/impl.h"
#include "toolchain/base/kind_switch.h"
#include "toolchain/sem_ir/file.h"
#include "toolchain/sem_ir/specific_interface.h"
#include "toolchain/sem_ir/specific_named_constraint.h"
namespace Carbon::SemIR {
ImplStore::ImplStore(File& sem_ir)
: sem_ir_(sem_ir), values_(sem_ir.check_ir_id()) {}
auto ImplStore::GetOrAddLookupBucket(const Impl& impl) -> LookupBucketRef {
auto self_id = sem_ir_.constant_values().GetConstantInstId(impl.self_id);
InterfaceId interface_id = InterfaceId::None;
SpecificId specific_id = SpecificId::None;
auto facet_type_id = TypeId::ForTypeConstant(
sem_ir_.constant_values().Get(impl.constraint_id));
if (auto facet_type = sem_ir_.types().TryGetAs<FacetType>(facet_type_id)) {
const FacetTypeInfo& facet_type_info =
sem_ir_.facet_types().Get(facet_type->facet_type_id);
if (auto single = facet_type_info.TryAsSingleExtend()) {
CARBON_KIND_SWITCH(*single) {
case CARBON_KIND(SemIR::SpecificInterface interface): {
interface_id = interface.interface_id;
specific_id = interface.specific_id;
break;
}
case CARBON_KIND(SemIR::SpecificNamedConstraint _): {
// TODO: Handle named constraints which resolve to a single interface
// in the IdentifiedFacetType.
break;
}
}
}
}
return LookupBucketRef(
*this, lookup_
.Insert(std::tuple{self_id, interface_id, specific_id},
[] { return ImplOrLookupBucketId::None; })
.value());
}
} // namespace Carbon::SemIR