Files
carbon-lang/toolchain/sem_ir/class.cpp
T
Jon Ross-Perkins 4923445e3a Drop Singleton from ErrorInst::SingletonInstId and similar (#5304)
We frequently want to operate on singletons. Per discussion, drop
`Singleton` to make the code shorter.

This started off as wanting to write `inst_id.is_error()`, but the
dependency relationship between ids.h and singleton_insts.h would
require some kind of delayed evaluation to allow the implementation to
remain in headers (which I suspect is helpful to have for inlining). I
could have added something like `IsErrorInst`, forward declared in ids.h
and defined in singleton_insts.h (which would always be included by
typed_insts.h), but the template approach felt like a decent balance
between (a) removing the boilerplate `::SingletonInstId`, (b)
understandability, (c) still visually mirroring if we immediately return
a singleton, and (d) flexibility for more than just `ErrorInst`. But TBH
I'd probably still have written `is_error()` if it didn't require
addressing the cross-header cycle.

Then I tried `SemIR::InstId::Is<SemIR::ErrorInst>`, which generally
worked with types but generated the complaint that it didn't shorten
*all* singleton uses. So pulling back on `::Is`, and instead just
dropping `Singleton`.
2025-04-15 22:40:29 +00:00

55 lines
1.7 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/class.h"
#include "toolchain/sem_ir/file.h"
#include "toolchain/sem_ir/generic.h"
#include "toolchain/sem_ir/ids.h"
#include "toolchain/sem_ir/typed_insts.h"
namespace Carbon::SemIR {
static auto GetFoundationType(const File& file, SpecificId specific_id,
InstId inst_id) -> TypeId {
if (!inst_id.has_value()) {
return TypeId::None;
}
if (inst_id == SemIR::ErrorInst::InstId) {
return ErrorInst::TypeId;
}
return TypeId::ForTypeConstant(GetConstantValueInSpecific(
file, specific_id,
file.insts().GetAs<AnyFoundationDecl>(inst_id).foundation_type_inst_id));
}
auto Class::GetAdaptedType(const File& file, SpecificId specific_id) const
-> TypeId {
return GetFoundationType(file, specific_id, adapt_id);
}
auto Class::GetBaseType(const File& file, SpecificId specific_id) const
-> TypeId {
return GetFoundationType(file, specific_id, base_id);
}
auto Class::GetObjectRepr(const File& file, SpecificId specific_id) const
-> TypeId {
if (!complete_type_witness_id.has_value()) {
return TypeId::None;
}
auto witness_id =
GetConstantValueInSpecific(file, specific_id, complete_type_witness_id);
if (witness_id == ErrorInst::ConstantId) {
return ErrorInst::TypeId;
}
return file.types().GetTypeIdForTypeInstId(
file.insts()
.GetAs<CompleteTypeWitness>(
file.constant_values().GetInstId(witness_id))
.object_repr_type_inst_id);
}
} // namespace Carbon::SemIR