diff --git a/toolchain/check/import_ref.cpp b/toolchain/check/import_ref.cpp index e8a92f0bb983..606a01285a8f 100644 --- a/toolchain/check/import_ref.cpp +++ b/toolchain/check/import_ref.cpp @@ -101,29 +101,6 @@ auto AddImportRef(Context& context, SemIR::ImportIRInst import_ir_inst, return import_ref_id; } -// Adds an import_ref instruction for an instruction that we have already loaded -// from an imported IR, with a known constant value. This is useful when the -// instruction has a symbolic constant value, in order to produce an instruction -// that hold that symbolic constant. -static auto AddLoadedImportRef(Context& context, SemIR::TypeId type_id, - SemIR::ImportIRInst import_ir_inst, - SemIR::ConstantId const_id) -> SemIR::InstId { - auto import_ir_inst_id = context.import_ir_insts().Add(import_ir_inst); - SemIR::ImportRefLoaded inst = {.type_id = type_id, - .import_ir_inst_id = import_ir_inst_id, - .entity_name_id = SemIR::EntityNameId::None}; - auto inst_id = AddPlaceholderInstInNoBlock( - context, MakeImportedLocIdAndInst(context, import_ir_inst_id, inst)); - context.imports().push_back(inst_id); - - context.constant_values().Set(inst_id, const_id); - context - .import_ir_constant_values()[context.sem_ir().import_irs().GetRawIndex( - import_ir_inst.ir_id())] - .Set(import_ir_inst.inst_id(), const_id); - return inst_id; -} - static auto GetCanonicalImportIRInst(Context& context, const SemIR::File* target_ir, SemIR::InstId target_inst_id) @@ -685,6 +662,7 @@ class ImportRefResolver : public ImportContext { }; } // namespace +// Wrapper for `AddImportRef` that provides the `import_ir_id`. static auto AddImportRef(ImportContext& context, SemIR::InstId inst_id, SemIR::EntityNameId entity_name_id = SemIR::EntityNameId::None) -> SemIR::InstId { @@ -693,12 +671,39 @@ static auto AddImportRef(ImportContext& context, SemIR::InstId inst_id, entity_name_id); } -static auto AddLoadedImportRef(ImportContext& context, SemIR::TypeId type_id, - SemIR::InstId inst_id, - SemIR::ConstantId const_id) -> SemIR::InstId { - return AddLoadedImportRef( - context.local_context(), type_id, - SemIR::ImportIRInst(context.import_ir_id(), inst_id), const_id); +// Adds an import_ref instruction for an instruction that we have already loaded +// from an imported IR, with a known constant value. This is useful when the +// instruction has a symbolic constant value, in order to produce an instruction +// that hold that symbolic constant. +static auto AddLoadedImportRef(ImportContext& context, + SemIR::TypeId local_type_id, + SemIR::InstId import_inst_id, + SemIR::ConstantId local_const_id) + -> SemIR::InstId { + auto import_ir_inst_id = context.local_import_ir_insts().Add( + SemIR::ImportIRInst(context.import_ir_id(), import_inst_id)); + SemIR::ImportRefLoaded inst = {.type_id = local_type_id, + .import_ir_inst_id = import_ir_inst_id, + .entity_name_id = SemIR::EntityNameId::None}; + auto inst_id = AddPlaceholderInstInNoBlock( + context.local_context(), + MakeImportedLocIdAndInst(context.local_context(), import_ir_inst_id, + inst)); + context.local_context().imports().push_back(inst_id); + + context.local_constant_values().Set(inst_id, local_const_id); + context.local_constant_values_for_import_insts().Set(import_inst_id, + local_const_id); + return inst_id; +} + +// Like `AddLoadedImportRef`, but only for types, and returns a `TypeInstId`. +static auto AddLoadedImportRefForType(ImportContext& context, + SemIR::TypeInstId import_inst_id, + SemIR::ConstantId local_const_id) + -> SemIR::TypeInstId { + return context.local_types().GetAsTypeInstId(AddLoadedImportRef( + context, SemIR::TypeType::TypeId, import_inst_id, local_const_id)); } static auto AddImportIRInst(ImportContext& context, SemIR::InstId inst_id) @@ -1349,9 +1354,8 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver, return ResolveResult::Retry(); } - auto adapted_type_inst_id = resolver.local_ir().types().GetAsTypeInstId( - AddLoadedImportRef(resolver, SemIR::TypeType::TypeId, - inst.adapted_type_inst_id, adapted_type_const_id)); + auto adapted_type_inst_id = AddLoadedImportRefForType( + resolver, inst.adapted_type_inst_id, adapted_type_const_id); // Create a corresponding instruction to represent the declaration. return ResolveAsUnique( @@ -1533,9 +1537,8 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver, return ResolveResult::Retry(); } - auto base_type_inst_id = resolver.local_ir().types().GetAsTypeInstId( - AddLoadedImportRef(resolver, SemIR::TypeType::TypeId, - inst.base_type_inst_id, base_type_const_id)); + auto base_type_inst_id = AddLoadedImportRefForType( + resolver, inst.base_type_inst_id, base_type_const_id); // Create a corresponding instruction to represent the declaration. return ResolveAsUnique( @@ -2415,12 +2418,10 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver, // Create instructions for self and constraint to hold the symbolic constant // value for a generic impl. - new_impl.self_id = resolver.local_ir().types().GetAsTypeInstId( - AddLoadedImportRef(resolver, SemIR::TypeType::TypeId, import_impl.self_id, - self_const_id)); - new_impl.constraint_id = resolver.local_ir().types().GetAsTypeInstId( - AddLoadedImportRef(resolver, SemIR::TypeType::TypeId, - import_impl.constraint_id, constraint_const_id)); + new_impl.self_id = + AddLoadedImportRefForType(resolver, import_impl.self_id, self_const_id); + new_impl.constraint_id = AddLoadedImportRefForType( + resolver, import_impl.constraint_id, constraint_const_id); new_impl.interface = GetLocalSpecificInterface( resolver, import_impl.interface, specific_interface_data); if (import_impl.is_complete()) {