mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 06:34:41 +01:00
Replace manual CoreInterface tables with x-macros (#7176)
Manually filling out tables involving `CoreInterface` is error-prone, especially when switching on strings, which the compiler can't warn on.
This commit is contained in:
@@ -551,45 +551,13 @@ auto BuildCustomWitness(Context& context, SemIR::LocId loc_id,
|
||||
}
|
||||
|
||||
auto AsCoreIdentifier(SemIR::CoreInterface core_interface) -> CoreIdentifier {
|
||||
using SemIR::CoreInterface;
|
||||
switch (core_interface) {
|
||||
case CoreInterface::AddAssignWith:
|
||||
return CoreIdentifier::AddAssignWith;
|
||||
case CoreInterface::AddWith:
|
||||
return CoreIdentifier::AddWith;
|
||||
case CoreInterface::Copy:
|
||||
return CoreIdentifier::Copy;
|
||||
case CoreInterface::CppUnsafeDeref:
|
||||
return CoreIdentifier::CppUnsafeDeref;
|
||||
case CoreInterface::Dec:
|
||||
return CoreIdentifier::Dec;
|
||||
case CoreInterface::Default:
|
||||
return CoreIdentifier::Default;
|
||||
case CoreInterface::Destroy:
|
||||
return CoreIdentifier::Destroy;
|
||||
case CoreInterface::DivAssignWith:
|
||||
return CoreIdentifier::DivAssignWith;
|
||||
case CoreInterface::DivWith:
|
||||
return CoreIdentifier::DivWith;
|
||||
case CoreInterface::Inc:
|
||||
return CoreIdentifier::Inc;
|
||||
case CoreInterface::IntFitsIn:
|
||||
return CoreIdentifier::IntFitsIn;
|
||||
case CoreInterface::ModAssignWith:
|
||||
return CoreIdentifier::ModAssignWith;
|
||||
case CoreInterface::ModWith:
|
||||
return CoreIdentifier::ModWith;
|
||||
case CoreInterface::MulAssignWith:
|
||||
return CoreIdentifier::MulAssignWith;
|
||||
case CoreInterface::MulWith:
|
||||
return CoreIdentifier::MulWith;
|
||||
case CoreInterface::Negate:
|
||||
return CoreIdentifier::Negate;
|
||||
case CoreInterface::SubAssignWith:
|
||||
return CoreIdentifier::SubAssignWith;
|
||||
case CoreInterface::SubWith:
|
||||
return CoreIdentifier::SubWith;
|
||||
case CoreInterface::Unknown:
|
||||
#define CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN
|
||||
#define CARBON_SEM_IR_CORE_INTERFACE_KIND(Name) \
|
||||
case SemIR::CoreInterface::Name: \
|
||||
return CoreIdentifier::Name;
|
||||
#include "toolchain/sem_ir/core_interface_kind.def"
|
||||
case SemIR::CoreInterface::Unknown:
|
||||
CARBON_FATAL("{0} doesn't have a `CoreIdentifier` mapping",
|
||||
core_interface);
|
||||
}
|
||||
|
||||
@@ -91,26 +91,13 @@ static auto BuildInterfaceDecl(Context& context,
|
||||
|
||||
if (context.sem_ir().package_id() == PackageNameId::Core) {
|
||||
auto name = context.names().GetIRBaseName(interface_info.name_id);
|
||||
// This is awful for readability, but it's the only viable way to ensure
|
||||
// adding new core interfaces are automatically picked up.
|
||||
interface_info.core_interface =
|
||||
llvm::StringSwitch<SemIR::CoreInterface>(name)
|
||||
.Case("AddAssignWith", SemIR::CoreInterface::AddAssignWith)
|
||||
.Case("AddWith", SemIR::CoreInterface::AddWith)
|
||||
.Case("Copy", SemIR::CoreInterface::Copy)
|
||||
.Case("CppUnsafeDeref", SemIR::CoreInterface::CppUnsafeDeref)
|
||||
.Case("Dec", SemIR::CoreInterface::Dec)
|
||||
.Case("Default", SemIR::CoreInterface::Default)
|
||||
.Case("Destroy", SemIR::CoreInterface::Destroy)
|
||||
.Case("DivAssignWith", SemIR::CoreInterface::DivAssignWith)
|
||||
.Case("DivWith", SemIR::CoreInterface::DivWith)
|
||||
.Case("Inc", SemIR::CoreInterface::Inc)
|
||||
.Case("IntFitsIn", SemIR::CoreInterface::IntFitsIn)
|
||||
.Case("ModAssignWith", SemIR::CoreInterface::ModAssignWith)
|
||||
.Case("ModWith", SemIR::CoreInterface::ModWith)
|
||||
.Case("MulAssignWith", SemIR::CoreInterface::MulAssignWith)
|
||||
.Case("MulWith", SemIR::CoreInterface::MulWith)
|
||||
.Case("Negate", SemIR::CoreInterface::Negate)
|
||||
.Case("SubAssignWith", SemIR::CoreInterface::SubAssignWith)
|
||||
.Case("SubWith", SemIR::CoreInterface::SubWith)
|
||||
#define CARBON_SEM_IR_CORE_INTERFACE_KIND(Name) \
|
||||
.Case(#Name, SemIR::CoreInterface::Name)
|
||||
#include "toolchain/sem_ir/core_interface_kind.def"
|
||||
.Default(SemIR::CoreInterface::Unknown);
|
||||
}
|
||||
interface_decl.interface_id = context.interfaces().Add(interface_info);
|
||||
|
||||
@@ -35,6 +35,9 @@ CARBON_SEM_IR_CORE_INTERFACE_KIND(Negate)
|
||||
CARBON_SEM_IR_CORE_INTERFACE_KIND(SubAssignWith)
|
||||
CARBON_SEM_IR_CORE_INTERFACE_KIND(SubWith)
|
||||
|
||||
#ifndef CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN
|
||||
CARBON_SEM_IR_CORE_INTERFACE_KIND(Unknown)
|
||||
#endif // CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN
|
||||
|
||||
#undef CARBON_SEM_IR_CORE_INTERFACE_KIND
|
||||
#undef CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN
|
||||
|
||||
Reference in New Issue
Block a user