mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-01 22:02:45 +01:00
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.
49 lines
1.8 KiB
C++
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
|