@@ -333,12 +333,15 @@ class CompilationUnit {
333333 // Parses tokens. Returns true on success.
334334 auto RunParse () -> void;
335335
336- auto PreCheck () -> Parse::NodeLocConverter&;
336+ // Prepares per-IR lazy fetch functions which may come up in cross-IR
337+ // diagnostics.
338+ auto PreCheck () -> llvm::function_ref<const Parse::TreeAndSubtrees&()>;
337339
338340 // Returns information needed to check this unit.
339- auto GetCheckUnit (SemIR::CheckIRId check_ir_id,
340- llvm::ArrayRef<Parse::NodeLocConverter*> node_converters)
341- -> Check::Unit;
341+ auto GetCheckUnit (
342+ SemIR::CheckIRId check_ir_id,
343+ llvm::ArrayRef<llvm::function_ref<const Parse::TreeAndSubtrees&()>>
344+ all_trees_and_subtrees) -> Check::Unit;
342345
343346 // Runs post-check logic. Returns true if checking succeeded for the IR.
344347 auto PostCheck () -> void;
@@ -411,7 +414,6 @@ class CompilationUnit {
411414 std::optional<Parse::TreeAndSubtrees> parse_tree_and_subtrees_;
412415 std::optional<std::function<const Parse::TreeAndSubtrees&()>>
413416 get_parse_tree_and_subtrees_;
414- std::optional<Parse::NodeLocConverter> node_converter_;
415417 std::optional<Check::SemIRDiagnosticConverter> sem_ir_converter_;
416418 std::optional<SemIR::File> sem_ir_;
417419 std::unique_ptr<llvm::LLVMContext> llvm_context_;
@@ -497,33 +499,32 @@ auto CompilationUnit::RunParse() -> void {
497499 }
498500}
499501
500- auto CompilationUnit::PreCheck () -> Parse::NodeLocConverter& {
502+ auto CompilationUnit::PreCheck ()
503+ -> llvm::function_ref<const Parse::TreeAndSubtrees&()> {
501504 CARBON_CHECK (parse_tree_, " Must call RunParse first" );
502- CARBON_CHECK (!node_converter_ , " Called PreCheck twice" );
505+ CARBON_CHECK (!get_parse_tree_and_subtrees_ , " Called PreCheck twice" );
503506
504507 get_parse_tree_and_subtrees_ = [this ]() -> const Parse::TreeAndSubtrees& {
505508 return this ->GetParseTreeAndSubtrees ();
506509 };
507- node_converter_.emplace (&*tokens_, source_->filename (),
508- *get_parse_tree_and_subtrees_);
509- return *node_converter_;
510+ return *get_parse_tree_and_subtrees_;
510511}
511512
512513auto CompilationUnit::GetCheckUnit (
513514 SemIR::CheckIRId check_ir_id,
514- llvm::ArrayRef<Parse::NodeLocConverter*> node_converters) -> Check::Unit {
515- CARBON_CHECK (node_converter_, " Must call PreCheck first" );
515+ llvm::ArrayRef<llvm::function_ref<const Parse::TreeAndSubtrees&()>>
516+ all_trees_and_subtrees) -> Check::Unit {
517+ CARBON_CHECK (get_parse_tree_and_subtrees_, " Must call PreCheck first" );
516518 CARBON_CHECK (!sem_ir_converter_, " Called GetCheckUnit twice" );
517519
518520 sem_ir_.emplace (&*parse_tree_, check_ir_id, parse_tree_->packaging_decl (),
519521 value_stores_, input_filename_);
520- sem_ir_converter_.emplace (node_converters , &*sem_ir_);
522+ sem_ir_converter_.emplace (all_trees_and_subtrees , &*sem_ir_);
521523 return {.consumer = consumer_,
522524 .value_stores = &value_stores_,
523525 .timings = timings_ ? &*timings_ : nullptr ,
524526 .get_parse_tree_and_subtrees = *get_parse_tree_and_subtrees_,
525527 .sem_ir = &*sem_ir_,
526- .node_converter = &*node_converter_,
527528 .sem_ir_converter = &*sem_ir_converter_};
528529}
529530
@@ -841,23 +842,25 @@ auto CompileSubcommand::Run(DriverEnv& driver_env) -> DriverResult {
841842 }
842843
843844 // Pre-check assigns IR IDs and constructs node converters.
844- llvm::SmallVector<Parse::NodeLocConverter*> node_converters;
845+ llvm::SmallVector<llvm::function_ref<const Parse::TreeAndSubtrees&()>>
846+ all_trees_and_subtrees;
845847 // This size may not match due to units that are missing source, but that's an
846848 // error case and not worth extra work.
847- node_converters .reserve (units.size ());
849+ all_trees_and_subtrees .reserve (units.size ());
848850 for (auto & unit : units) {
849851 if (unit->has_source ()) {
850- node_converters .push_back (& unit->PreCheck ());
852+ all_trees_and_subtrees .push_back (unit->PreCheck ());
851853 }
852854 }
853855
854856 // Gather Check::Units.
855857 llvm::SmallVector<Check::Unit> check_units;
856- check_units.reserve (node_converters .size ());
858+ check_units.reserve (all_trees_and_subtrees .size ());
857859 for (auto & unit : units) {
858860 if (unit->has_source ()) {
859861 SemIR::CheckIRId check_ir_id (check_units.size ());
860- check_units.push_back (unit->GetCheckUnit (check_ir_id, node_converters));
862+ check_units.push_back (
863+ unit->GetCheckUnit (check_ir_id, all_trees_and_subtrees));
861864 }
862865 }
863866
0 commit comments