diff --git a/toolchain/check/import_ref.cpp b/toolchain/check/import_ref.cpp index f6e9da933ffa..ec35cf52706f 100644 --- a/toolchain/check/import_ref.cpp +++ b/toolchain/check/import_ref.cpp @@ -1529,28 +1529,30 @@ static auto AddAssociatedEntities(ImportContext& context, for (auto inst_id : associated_entities) { // Determine the name of the associated entity, by switching on its kind. SemIR::NameId import_name_id = SemIR::NameId::None; - if (auto assoc_const_decl = - context.import_insts().TryGetAs( - inst_id)) { - const auto& assoc_const = context.import_associated_constants().Get( - assoc_const_decl->assoc_const_id); - import_name_id = assoc_const.name_id; - } else if (auto function_decl = - context.import_insts().TryGetAs( - inst_id)) { - const auto& function = - context.import_functions().Get(function_decl->function_id); - import_name_id = function.name_id; - } else if (auto import_ref = - context.import_insts().TryGetAs( - inst_id)) { - import_name_id = - context.import_entity_names().Get(import_ref->entity_name_id).name_id; - } else { - // We don't need `GetWithAttachedType` here because we don't access the - // type. - CARBON_FATAL("Unhandled associated entity kind: {0}", - context.import_insts().Get(inst_id).kind()); + // We don't need `GetWithAttachedType` here because we don't access the + // type. + auto inst = context.import_insts().Get(inst_id); + CARBON_KIND_SWITCH(inst) { + case CARBON_KIND(SemIR::AssociatedConstantDecl assoc_const_decl): { + const auto& assoc_const = context.import_associated_constants().Get( + assoc_const_decl.assoc_const_id); + import_name_id = assoc_const.name_id; + break; + } + case CARBON_KIND(SemIR::FunctionDecl function_decl): { + const auto& function = + context.import_functions().Get(function_decl.function_id); + import_name_id = function.name_id; + break; + } + case CARBON_KIND_ANY(SemIR::AnyImportRef, import_ref): { + import_name_id = context.import_entity_names() + .Get(import_ref.entity_name_id) + .name_id; + break; + } + default: + CARBON_FATAL("Unhandled associated entity kind: {0}", inst.kind()); } auto name_id = GetLocalNameId(context, import_name_id); auto entity_name_id = context.local_entity_names().Add( diff --git a/toolchain/check/pattern_match.cpp b/toolchain/check/pattern_match.cpp index 10ac51c15e1b..115f4c24037d 100644 --- a/toolchain/check/pattern_match.cpp +++ b/toolchain/check/pattern_match.cpp @@ -509,16 +509,19 @@ auto MatchContext::DoPreWork(State state, SemIR::AnyParamPattern param_pattern, auto loc_id = SemIR::LocId(entry.pattern_id); auto param_id = SemIR::InstId::None; // TODO: find a way to avoid this boilerplate. - switch (param.kind()) { - case SemIR::OutParam::Kind: - param_id = AddInst(context_, loc_id, param.As()); + CARBON_KIND_SWITCH(param) { + case CARBON_KIND(SemIR::OutParam out_param): { + param_id = AddInst(context_, loc_id, out_param); break; - case SemIR::RefParam::Kind: - param_id = AddInst(context_, loc_id, param.As()); + } + case CARBON_KIND(SemIR::RefParam ref_param): { + param_id = AddInst(context_, loc_id, ref_param); break; - case SemIR::ValueParam::Kind: - param_id = AddInst(context_, loc_id, param.As()); + } + case CARBON_KIND(SemIR::ValueParam value_param): { + param_id = AddInst(context_, loc_id, value_param); break; + } default: CARBON_FATAL("Unexpected parameter kind"); } diff --git a/toolchain/sem_ir/inst_namer.cpp b/toolchain/sem_ir/inst_namer.cpp index 2b409e89d07d..0e45d767246f 100644 --- a/toolchain/sem_ir/inst_namer.cpp +++ b/toolchain/sem_ir/inst_namer.cpp @@ -1428,32 +1428,38 @@ auto InstNamer::NamingContext::NameInst() -> void { return; } case CARBON_KIND(StructValue inst): { - if (auto fn_ty = sem_ir().types().TryGetAs(inst.type_id)) { - AddEntityNameAndMaybePush(fn_ty->function_id); - } else if (auto class_ty = - sem_ir().types().TryGetAs(inst.type_id)) { - AddEntityNameAndMaybePush(class_ty->class_id, ".val"); - } else if (auto generic_class_ty = - sem_ir().types().TryGetAs( - inst.type_id)) { - AddEntityNameAndMaybePush(generic_class_ty->class_id, ".generic"); - } else if (auto generic_interface_ty = - sem_ir().types().TryGetAs( - inst.type_id)) { - AddInstNameId(sem_ir() - .interfaces() - .Get(generic_interface_ty->interface_id) - .name_id, - ".generic"); - } else if (auto template_name_ty = - sem_ir().types().TryGetAs( - inst.type_id)) { - AddInstEntityNameId(template_name_ty->name_id, ".template"); - } else { - if (sem_ir().inst_blocks().Get(inst.elements_id).empty()) { - AddInstName("empty_struct"); - } else { - AddInstName("struct"); + CARBON_KIND_SWITCH(sem_ir().types().GetAsInst(inst.type_id)) { + case CARBON_KIND(FunctionType fn_ty): { + AddEntityNameAndMaybePush(fn_ty.function_id); + break; + } + case CARBON_KIND(ClassType class_ty): { + AddEntityNameAndMaybePush(class_ty.class_id, ".val"); + break; + } + case CARBON_KIND(GenericClassType generic_class_ty): { + AddEntityNameAndMaybePush(generic_class_ty.class_id, ".generic"); + break; + } + case CARBON_KIND(GenericInterfaceType generic_interface_ty): { + AddInstNameId(sem_ir() + .interfaces() + .Get(generic_interface_ty.interface_id) + .name_id, + ".generic"); + break; + } + case CARBON_KIND(CppTemplateNameType template_name_ty): { + AddInstEntityNameId(template_name_ty.name_id, ".template"); + break; + } + default: { + if (sem_ir().inst_blocks().Get(inst.elements_id).empty()) { + AddInstName("empty_struct"); + } else { + AddInstName("struct"); + } + break; } } return; diff --git a/toolchain/sem_ir/stringify.cpp b/toolchain/sem_ir/stringify.cpp index 85cde308cb3e..42d4b9c8457d 100644 --- a/toolchain/sem_ir/stringify.cpp +++ b/toolchain/sem_ir/stringify.cpp @@ -750,19 +750,23 @@ class Stringifier { auto entity_inst_id = entities[index]; step_stack_->PushString(")"); step_stack_->PushResumeQualfiedNames(); - if (auto associated_const = - sem_ir_->insts().TryGetAs( - entity_inst_id)) { - step_stack_->PushNameId(sem_ir_->associated_constants() - .Get(associated_const->assoc_const_id) - .name_id); - } else if (auto function_decl = - sem_ir_->insts().TryGetAs(entity_inst_id)) { - const auto& function = - sem_ir_->functions().Get(function_decl->function_id); - step_stack_->PushNameId(function.name_id); - } else { - step_stack_->PushInstId(entity_inst_id); + CARBON_KIND_SWITCH(sem_ir_->insts().Get(entity_inst_id)) { + case CARBON_KIND(AssociatedConstantDecl associated_const): { + step_stack_->PushNameId(sem_ir_->associated_constants() + .Get(associated_const.assoc_const_id) + .name_id); + break; + } + case CARBON_KIND(FunctionDecl function_decl): { + const auto& function = + sem_ir_->functions().Get(function_decl.function_id); + step_stack_->PushNameId(function.name_id); + break; + } + default: { + step_stack_->PushInstId(entity_inst_id); + break; + } } // Don't qualify names after the `.` operator, until the closing `)`. step_stack_->PushStopQualfiedNames();