From: Arthur Cohen <[email protected]>

The ImmutableNRCtx was actually very mutable, as part of the pipeline needs to 
still map
usages later down the line deep within the backend and typecheckers. Instead, 
add a
new `map_usage` method which maps to the leafmost definition possible.

gcc/rust/ChangeLog:

        * Make-lang.in: Rename.
        * backend/rust-compile-base.cc: Use new name and API.
        * backend/rust-compile-context.h: Likewise.
        * backend/rust-compile-expr.cc (CompileExpr::visit): Likewise.
        (CompileExpr::generate_closure_function): Likewise.
        * backend/rust-compile-implitem.cc (CompileTraitItem::visit): Likewise.
        * backend/rust-compile-item.cc (CompileItem::visit): Likewise.
        * backend/rust-compile-resolve-path.cc (ResolvePathRef::resolve): 
Likewise.
        * checks/errors/borrowck/rust-bir-builder-internal.h (struct 
BuilderContext): Likewise.
        * checks/errors/privacy/rust-privacy-check.cc (Resolver::resolve): 
Likewise.
        * checks/errors/privacy/rust-privacy-reporter.cc: Likewise.
        * checks/errors/privacy/rust-privacy-reporter.h: Likewise.
        * checks/errors/privacy/rust-visibility-resolver.cc: Likewise.
        * checks/errors/privacy/rust-visibility-resolver.h: Likewise.
        * checks/errors/rust-const-checker.cc (ConstChecker::visit): Likewise.
        * checks/errors/rust-hir-pattern-analysis.cc 
(PatternChecker::PatternChecker): Likewise.
        * checks/errors/rust-hir-pattern-analysis.h: Likewise.
        * checks/errors/rust-readonly-check.cc (ReadonlyChecker::visit): 
Likewise.
        * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Likewise.
        * checks/lints/rust-lint-marklive.cc (MarkLive::visit_path_segment): 
Likewise.
        (MarkLive::visit): Likewise.
        (MarkLive::find_ref_node_id): Likewise.
        * checks/lints/unused/rust-unused-checker.cc 
(UnusedChecker::UnusedChecker): Likewise.
        * checks/lints/unused/rust-unused-checker.h: Likewise.
        * checks/lints/unused/rust-unused-collector.cc 
(UnusedCollector::UnusedCollector): Likewise.
        * checks/lints/unused/rust-unused-collector.h: Likewise.
        * resolve/rust-immutable-name-resolution-context.cc: Move to...
        * resolve/rust-finalized-name-resolution-context.cc: ...here.
        * resolve/rust-name-resolution-context.h: Likewise.
        * rust-session-manager.cc (Session::compile_crate): Likewise.
        * typecheck/rust-hir-trait-resolve.cc 
(TraitResolver::resolve_path_to_trait): Likewise.
        * typecheck/rust-hir-type-check-enumitem.cc (TypeCheckEnumItem::visit): 
Likewise.
        * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): 
Likewise.
        (TypeCheckExpr::resolve_fn_trait_call): Likewise.
        * typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItem::visit): 
Likewise.
        * typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): 
Likewise.
        * typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): 
Likewise.
        (TypeCheckExpr::resolve_root_path): Likewise.
        (TypeCheckExpr::resolve_segments): Likewise.
        * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): 
Likewise.
        * typecheck/rust-hir-type-check-type.cc 
(TypeCheckType::resolve_root_path): Likewise.
        (ResolveWhereClauseItem::visit): Likewise.
        * typecheck/rust-hir-type-check.cc 
(TraitItemReference::get_type_from_fn): Likewise.
        * typecheck/rust-type-util.cc (query_type): Likewise.
        * checks/errors/rust-const-checker.h: Likewise.
        * checks/errors/rust-unsafe-checker.h: Likewise.
        * checks/lints/rust-lint-marklive.h: Likewise.
        * resolve/rust-immutable-name-resolution-context.h: Removed.
        * resolve/rust-finalized-name-resolution-context.h: New file.
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/f2bf142976fb03f5bbb92b65f5a15f7c92da2d74

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4551

 gcc/rust/Make-lang.in                         |  2 +-
 gcc/rust/backend/rust-compile-base.cc         |  2 +-
 gcc/rust/backend/rust-compile-context.h       |  2 +-
 gcc/rust/backend/rust-compile-expr.cc         | 15 ++--
 gcc/rust/backend/rust-compile-implitem.cc     |  6 +-
 gcc/rust/backend/rust-compile-item.cc         | 11 +--
 gcc/rust/backend/rust-compile-resolve-path.cc |  3 +-
 .../borrowck/rust-bir-builder-internal.h      |  6 +-
 .../errors/privacy/rust-privacy-check.cc      |  5 +-
 .../errors/privacy/rust-privacy-reporter.cc   |  8 +-
 .../errors/privacy/rust-privacy-reporter.h    |  6 +-
 .../privacy/rust-visibility-resolver.cc       |  4 +-
 .../errors/privacy/rust-visibility-resolver.h |  9 ++-
 gcc/rust/checks/errors/rust-const-checker.cc  |  4 +-
 gcc/rust/checks/errors/rust-const-checker.h   |  4 +-
 .../errors/rust-hir-pattern-analysis.cc       |  4 +-
 .../checks/errors/rust-hir-pattern-analysis.h |  4 +-
 gcc/rust/checks/errors/rust-readonly-check.cc |  5 +-
 gcc/rust/checks/errors/rust-unsafe-checker.cc |  4 +-
 gcc/rust/checks/errors/rust-unsafe-checker.h  |  4 +-
 gcc/rust/checks/lints/rust-lint-marklive.cc   |  2 +-
 gcc/rust/checks/lints/rust-lint-marklive.h    |  7 +-
 .../lints/unused/rust-unused-checker.cc       |  3 +-
 .../checks/lints/unused/rust-unused-checker.h |  4 +-
 .../lints/unused/rust-unused-collector.cc     |  5 +-
 .../lints/unused/rust-unused-collector.h      |  4 +-
 ...rust-finalized-name-resolution-context.cc} | 39 ++++++---
 .../rust-finalized-name-resolution-context.h  | 80 +++++++++++++++++++
 .../rust-immutable-name-resolution-context.h  | 55 -------------
 .../resolve/rust-name-resolution-context.h    |  4 +-
 gcc/rust/rust-session-manager.cc              |  4 +-
 gcc/rust/typecheck/rust-hir-trait-resolve.cc  |  5 +-
 .../typecheck/rust-hir-type-check-enumitem.cc | 14 ++--
 .../typecheck/rust-hir-type-check-expr.cc     | 17 ++--
 .../typecheck/rust-hir-type-check-implitem.cc |  8 +-
 .../typecheck/rust-hir-type-check-item.cc     | 17 ++--
 .../typecheck/rust-hir-type-check-path.cc     | 11 +--
 .../typecheck/rust-hir-type-check-pattern.cc  |  5 +-
 .../typecheck/rust-hir-type-check-type.cc     |  8 +-
 gcc/rust/typecheck/rust-hir-type-check.cc     |  5 +-
 gcc/rust/typecheck/rust-type-util.cc          |  5 +-
 41 files changed, 207 insertions(+), 203 deletions(-)
 rename gcc/rust/resolve/{rust-immutable-name-resolution-context.cc => 
rust-finalized-name-resolution-context.cc} (50%)
 create mode 100644 gcc/rust/resolve/rust-finalized-name-resolution-context.h
 delete mode 100644 gcc/rust/resolve/rust-immutable-name-resolution-context.h

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index 878613f70..b4a042bda 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -149,7 +149,7 @@ GRS_OBJS = \
        rust/rust-ice-finalizer.o \
     rust/rust-late-name-resolver-2.0.o \
     rust/rust-identifier-path.o \
-       rust/rust-immutable-name-resolution-context.o \
+       rust/rust-finalized-name-resolution-context.o \
     rust/rust-name-resolver.o \
     rust/rust-resolve-builtins.o \
     rust/rust-forever-stack.o \
diff --git a/gcc/rust/backend/rust-compile-base.cc 
b/gcc/rust/backend/rust-compile-base.cc
index b7f2628f5..340e26178 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -33,7 +33,7 @@
 #include "rust-compile-implitem.h"
 #include "rust-attribute-values.h"
 #include "rust-attributes.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 #include "fold-const.h"
 #include "stringpool.h"
diff --git a/gcc/rust/backend/rust-compile-context.h 
b/gcc/rust/backend/rust-compile-context.h
index 3fd686d81..abc8f1ed5 100644
--- a/gcc/rust/backend/rust-compile-context.h
+++ b/gcc/rust/backend/rust-compile-context.h
@@ -27,7 +27,7 @@
 #include "rust-hir-full.h"
 #include "rust-mangle.h"
 #include "rust-tree.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Compile {
diff --git a/gcc/rust/backend/rust-compile-expr.cc 
b/gcc/rust/backend/rust-compile-expr.cc
index 1c69d511e..57d401fd6 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -897,8 +897,7 @@ CompileExpr::visit (HIR::BreakExpr &expr)
 
   if (expr.has_label ())
     {
-      auto &nr_ctx
-       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+      auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
       NodeId resolved_node_id;
       if (auto id
@@ -953,8 +952,7 @@ CompileExpr::visit (HIR::ContinueExpr &expr)
   tree label = ctx->peek_loop_begin_label ();
   if (expr.has_label ())
     {
-      auto &nr_ctx
-       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+      auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
       NodeId resolved_node_id;
       if (auto id
@@ -2605,10 +2603,10 @@ CompileExpr::generate_closure_function 
(HIR::ClosureExpr &expr,
   if (is_block_expr)
     {
       auto body_mappings = function_body.get_mappings ();
-      auto &nr_ctx
-       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+      auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
-      auto candidate = nr_ctx.values.to_rib (body_mappings.get_nodeid ());
+      auto candidate
+       = nr_ctx.get_underlying ().values.to_rib (body_mappings.get_nodeid ());
 
       rust_assert (candidate.has_value ());
     }
@@ -2821,8 +2819,7 @@ CompileExpr::lookup_temp_var (NodeId to_be_resolved)
 HirId
 CompileExpr::resolve_NodeId (NodeId to_be_resolved)
 {
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   NodeId resolved_node_id;
   resolved_node_id = nr_ctx.lookup (to_be_resolved).value ();
diff --git a/gcc/rust/backend/rust-compile-implitem.cc 
b/gcc/rust/backend/rust-compile-implitem.cc
index 9689ee7f7..df5726661 100644
--- a/gcc/rust/backend/rust-compile-implitem.cc
+++ b/gcc/rust/backend/rust-compile-implitem.cc
@@ -27,8 +27,7 @@ CompileTraitItem::visit (HIR::TraitItemConst &constant)
   rust_assert (concrete != nullptr);
   TyTy::BaseType *resolved_type = concrete;
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (constant.get_mappings ().get_nodeid ());
@@ -89,8 +88,7 @@ CompileTraitItem::visit (HIR::TraitItemFunc &func)
       fntype->override_context ();
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (func.get_mappings ().get_nodeid ());
diff --git a/gcc/rust/backend/rust-compile-item.cc 
b/gcc/rust/backend/rust-compile-item.cc
index f9b003cf5..788373fb9 100644
--- a/gcc/rust/backend/rust-compile-item.cc
+++ b/gcc/rust/backend/rust-compile-item.cc
@@ -21,7 +21,7 @@
 #include "rust-compile-extern.h"
 #include "rust-substitution-mapper.h"
 #include "rust-type-util.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Compile {
@@ -50,8 +50,7 @@ CompileItem::visit (HIR::StaticItem &var)
 
   tree type = TyTyResolveCompile::compile (ctx, resolved_type);
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (var.get_mappings ().get_nodeid ());
@@ -103,8 +102,7 @@ CompileItem::visit (HIR::ConstantItem &constant)
     const_value_expr.get_mappings ().get_hirid (), &expr_type);
   rust_assert (ok);
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   // canonical path
   Resolver::CanonicalPath canonical_path
@@ -200,8 +198,7 @@ CompileItem::visit (HIR::Function &function)
        }
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   Resolver::CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid ());
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc 
b/gcc/rust/backend/rust-compile-resolve-path.cc
index 03db1b02b..747ab98fa 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -231,8 +231,7 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment 
&final_segment,
 
   // this can fail because it might be a Constructor for something
   // in that case the caller should attempt ResolvePathType::Compile
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   auto resolved = nr_ctx.lookup (mappings.get_nodeid ());
 
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
index 107ec9dca..0f68c1b73 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-internal.h
@@ -26,7 +26,7 @@
 #include "rust-hir-visitor.h"
 #include "rust-bir.h"
 #include "rust-bir-free-region.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "options.h"
 
 namespace Rust {
@@ -74,7 +74,7 @@ struct BuilderContext
 
   // External context.
   Resolver::TypeCheckContext &tyctx;
-  const Resolver2_0::NameResolutionContext &resolver;
+  const Resolver2_0::FinalizedNameResolutionContext &resolver;
 
   // BIR output
   BasicBlocks basic_blocks;
@@ -103,7 +103,7 @@ struct BuilderContext
 public:
   BuilderContext ()
     : tyctx (*Resolver::TypeCheckContext::get ()),
-      resolver (Resolver2_0::ImmutableNameResolutionContext::get ().resolver 
())
+      resolver (Resolver2_0::FinalizedNameResolutionContext::get ())
   {
     basic_blocks.emplace_back (); // StartBB
   }
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-check.cc 
b/gcc/rust/checks/errors/privacy/rust-privacy-check.cc
index ae9d7017f..f17eff2e7 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-check.cc
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-check.cc
@@ -20,7 +20,7 @@
 #include "rust-reachability.h"
 #include "rust-hir-type-check.h"
 #include "rust-hir-map.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-visibility-resolver.h"
 #include "rust-pub-restricted-visitor.h"
 #include "rust-privacy-reporter.h"
@@ -35,8 +35,7 @@ Resolver::resolve (HIR::Crate &crate)
 {
   PrivacyContext ctx;
   auto &mappings = Analysis::Mappings::get ();
-  auto &resolver
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &resolver = Resolver2_0::FinalizedNameResolutionContext::get ();
   auto ty_ctx = ::Rust::Resolver::TypeCheckContext::get ();
 
   VisibilityResolver (mappings, resolver).go (crate);
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc 
b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
index 6da76be0d..c102bf6e9 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
@@ -22,14 +22,14 @@
 #include "rust-hir-stmt.h"
 #include "rust-hir-item.h"
 #include "rust-attribute-values.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Privacy {
 
 PrivacyReporter::PrivacyReporter (
   Analysis::Mappings &mappings,
-  const Resolver2_0::NameResolutionContext &resolver,
+  const Resolver2_0::FinalizedNameResolutionContext &resolver,
   const Rust::Resolver::TypeCheckContext &ty_ctx)
   : mappings (mappings), resolver (resolver), ty_ctx (ty_ctx),
     current_module (tl::nullopt)
@@ -136,8 +136,8 @@ PrivacyReporter::check_for_privacy_violation (const NodeId 
&use_id,
        // FIXME: This needs a LOT of TLC: hinting about the definition, a
        // string to say if it's a module, function, type, etc...
 
-       if (!resolver.values.is_module_descendant (mod_node_id,
-                                                  current_module.value ()))
+       if (!resolver.get_underlying ().values.is_module_descendant (
+             mod_node_id, current_module.value ()))
          valid = false;
       }
       break;
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h 
b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
index 8a8fc2563..3d827dfc3 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
@@ -24,7 +24,7 @@
 #include "rust-hir-visitor.h"
 #include "rust-hir-type-check.h"
 #include "rust-mapping-common.h"
-#include "rust-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Privacy {
@@ -39,7 +39,7 @@ class PrivacyReporter : public HIR::HIRExpressionVisitor,
 {
 public:
   PrivacyReporter (Analysis::Mappings &mappings,
-                  const Resolver2_0::NameResolutionContext &resolver,
+                  const Resolver2_0::FinalizedNameResolutionContext &resolver,
                   const Rust::Resolver::TypeCheckContext &ty_ctx);
 
   /**
@@ -158,7 +158,7 @@ types
   virtual void visit (HIR::ExprStmt &stmt);
 
   Analysis::Mappings &mappings;
-  const Resolver2_0::NameResolutionContext &resolver;
+  const Resolver2_0::FinalizedNameResolutionContext &resolver;
   const Rust::Resolver::TypeCheckContext &ty_ctx;
 
   // `None` means we're in the root module - the crate
diff --git a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc 
b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
index ac050f899..9240a6847 100644
--- a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
+++ b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
@@ -20,14 +20,14 @@
 #include "rust-ast.h"
 #include "rust-hir.h"
 #include "rust-hir-item.h"
-#include "rust-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Privacy {
 
 VisibilityResolver::VisibilityResolver (
   Analysis::Mappings &mappings,
-  const Resolver2_0::NameResolutionContext &resolver)
+  const Resolver2_0::FinalizedNameResolutionContext &resolver)
   : mappings (mappings), resolver (resolver)
 {}
 
diff --git a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.h 
b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.h
index ad20097d7..4951d97c4 100644
--- a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.h
+++ b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.h
@@ -24,7 +24,7 @@
 #include "rust-hir-stmt.h"
 #include "rust-hir-item.h"
 #include "rust-hir-map.h"
-#include "rust-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-hir-visitor.h"
 
 namespace Rust {
@@ -33,8 +33,9 @@ namespace Privacy {
 class VisibilityResolver : public HIR::HIRVisItemVisitor
 {
 public:
-  VisibilityResolver (Analysis::Mappings &mappings,
-                     const Resolver2_0::NameResolutionContext &resolver);
+  VisibilityResolver (
+    Analysis::Mappings &mappings,
+    const Resolver2_0::FinalizedNameResolutionContext &resolver);
 
   /**
    * Perform visibility resolving on an entire crate
@@ -93,7 +94,7 @@ public:
 
 private:
   Analysis::Mappings &mappings;
-  const Resolver2_0::NameResolutionContext &resolver;
+  const Resolver2_0::FinalizedNameResolutionContext &resolver;
   DefId current_module;
 };
 
diff --git a/gcc/rust/checks/errors/rust-const-checker.cc 
b/gcc/rust/checks/errors/rust-const-checker.cc
index 51ff2583f..7796b71f9 100644
--- a/gcc/rust/checks/errors/rust-const-checker.cc
+++ b/gcc/rust/checks/errors/rust-const-checker.cc
@@ -22,13 +22,13 @@
 #include "rust-hir-stmt.h"
 #include "rust-hir-item.h"
 #include "rust-system.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace HIR {
 
 ConstChecker::ConstChecker ()
-  : resolver (Resolver2_0::ImmutableNameResolutionContext::get ().resolver ()),
+  : resolver (Resolver2_0::FinalizedNameResolutionContext::get ()),
     mappings (Analysis::Mappings::get ())
 {}
 
diff --git a/gcc/rust/checks/errors/rust-const-checker.h 
b/gcc/rust/checks/errors/rust-const-checker.h
index dfdeb7ba0..1dae715d8 100644
--- a/gcc/rust/checks/errors/rust-const-checker.h
+++ b/gcc/rust/checks/errors/rust-const-checker.h
@@ -22,7 +22,7 @@
 #include "rust-hir-visitor.h"
 #include "rust-hir-type-check.h"
 #include "rust-stacked-contexts.h"
-#include "rust-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace HIR {
@@ -72,7 +72,7 @@ private:
     std::vector<std::unique_ptr<GenericParam>> &param, ConstGenericCtx 
context);
 
   StackedContexts<HirId> const_context;
-  const Resolver2_0::NameResolutionContext &resolver;
+  const Resolver2_0::FinalizedNameResolutionContext &resolver;
   Analysis::Mappings &mappings;
 
   virtual void visit (Lifetime &lifetime) override;
diff --git a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc 
b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
index b2a3e5e97..a9a5b6422 100644
--- a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
+++ b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
@@ -26,14 +26,14 @@
 #include "rust-mapping-common.h"
 #include "rust-system.h"
 #include "rust-tyty.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Analysis {
 
 PatternChecker::PatternChecker ()
   : tyctx (*Resolver::TypeCheckContext::get ()),
-    resolver (Resolver2_0::ImmutableNameResolutionContext::get ().resolver ()),
+    resolver (Resolver2_0::FinalizedNameResolutionContext::get ()),
     mappings (Analysis::Mappings::get ())
 {}
 
diff --git a/gcc/rust/checks/errors/rust-hir-pattern-analysis.h 
b/gcc/rust/checks/errors/rust-hir-pattern-analysis.h
index 1fc13d1af..433797ac0 100644
--- a/gcc/rust/checks/errors/rust-hir-pattern-analysis.h
+++ b/gcc/rust/checks/errors/rust-hir-pattern-analysis.h
@@ -26,7 +26,7 @@
 #include "rust-tyty.h"
 #include "optional.h"
 #include "rust-hir-visitor.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Analysis {
@@ -46,7 +46,7 @@ public:
 
 private:
   Resolver::TypeCheckContext &tyctx;
-  const Resolver2_0::NameResolutionContext &resolver;
+  const Resolver2_0::FinalizedNameResolutionContext &resolver;
   Analysis::Mappings &mappings;
 
   virtual void visit (Lifetime &lifetime) override;
diff --git a/gcc/rust/checks/errors/rust-readonly-check.cc 
b/gcc/rust/checks/errors/rust-readonly-check.cc
index acaf2afb6..734c766b5 100644
--- a/gcc/rust/checks/errors/rust-readonly-check.cc
+++ b/gcc/rust/checks/errors/rust-readonly-check.cc
@@ -24,7 +24,7 @@
 #include "rust-hir-pattern.h"
 #include "rust-mapping-common.h"
 #include "rust-system.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-tyty.h"
 
 namespace Rust {
@@ -63,8 +63,7 @@ ReadonlyChecker::visit (PathInExpression &expr)
   NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
   NodeId def_id;
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
   if (auto id = nr_ctx.lookup (ast_node_id))
     def_id = *id;
   else
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc 
b/gcc/rust/checks/errors/rust-unsafe-checker.cc
index e9305efc1..848505632 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -23,7 +23,7 @@
 #include "rust-hir-item.h"
 #include "rust-attribute-values.h"
 #include "rust-system.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-intrinsic-values.h"
 
 namespace Rust {
@@ -31,7 +31,7 @@ namespace HIR {
 
 UnsafeChecker::UnsafeChecker ()
   : context (*Resolver::TypeCheckContext::get ()),
-    resolver (Resolver2_0::ImmutableNameResolutionContext::get ().resolver ()),
+    resolver (Resolver2_0::FinalizedNameResolutionContext::get ()),
     mappings (Analysis::Mappings::get ())
 {}
 
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.h 
b/gcc/rust/checks/errors/rust-unsafe-checker.h
index bf345879d..ee38c7e66 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.h
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.h
@@ -20,7 +20,7 @@
 #define RUST_UNSAFE_CHECKER_H
 
 #include "rust-hir-visitor.h"
-#include "rust-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-hir-type-check.h"
 #include "rust-stacked-contexts.h"
 
@@ -54,7 +54,7 @@ private:
   StackedContexts<HirId> unsafe_context;
 
   Resolver::TypeCheckContext &context;
-  const Resolver2_0::NameResolutionContext &resolver;
+  const Resolver2_0::FinalizedNameResolutionContext &resolver;
   Analysis::Mappings &mappings;
 
   virtual void visit (Lifetime &lifetime) override;
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.cc 
b/gcc/rust/checks/lints/rust-lint-marklive.cc
index 5e15d5dc3..0d76e5f87 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.cc
+++ b/gcc/rust/checks/lints/rust-lint-marklive.cc
@@ -25,7 +25,7 @@
 #include "rust-hir-map.h"
 #include "rust-hir-path.h"
 #include "rust-name-resolver.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-system.h"
 
 namespace Rust {
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.h 
b/gcc/rust/checks/lints/rust-lint-marklive.h
index 253c26cfa..c651d2876 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.h
+++ b/gcc/rust/checks/lints/rust-lint-marklive.h
@@ -23,7 +23,7 @@
 #include "rust-hir-map.h"
 #include "rust-lint-marklive-base.h"
 #include "rust-name-resolver.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Analysis {
@@ -278,12 +278,11 @@ private:
   std::set<HirId> liveSymbols;
   std::set<HirId> scannedSymbols;
   Analysis::Mappings &mappings;
-  const Resolver2_0::NameResolutionContext &resolver;
+  const Resolver2_0::FinalizedNameResolutionContext &resolver;
   Resolver::TypeCheckContext *tyctx;
   MarkLive (std::vector<HirId> worklist)
     : worklist (worklist), mappings (Analysis::Mappings::get ()),
-      resolver (
-       Resolver2_0::ImmutableNameResolutionContext::get ().resolver ()),
+      resolver (Resolver2_0::FinalizedNameResolutionContext::get ()),
       tyctx (Resolver::TypeCheckContext::get ()){};
 
   void mark_hir_id (HirId);
diff --git a/gcc/rust/checks/lints/unused/rust-unused-checker.cc 
b/gcc/rust/checks/lints/unused/rust-unused-checker.cc
index 6ceda5515..542908c63 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-checker.cc
+++ b/gcc/rust/checks/lints/unused/rust-unused-checker.cc
@@ -27,8 +27,7 @@
 namespace Rust {
 namespace Analysis {
 UnusedChecker::UnusedChecker ()
-  : nr_context (
-    Resolver2_0::ImmutableNameResolutionContext::get ().resolver ()),
+  : nr_context (Resolver2_0::FinalizedNameResolutionContext::get ()),
     mappings (Analysis::Mappings::get ()), unused_context (UnusedContext ())
 {}
 void
diff --git a/gcc/rust/checks/lints/unused/rust-unused-checker.h 
b/gcc/rust/checks/lints/unused/rust-unused-checker.h
index 70ea660e7..58e588022 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-checker.h
+++ b/gcc/rust/checks/lints/unused/rust-unused-checker.h
@@ -22,7 +22,7 @@
 #include "rust-hir-pattern.h"
 #include "rust-hir-visitor.h"
 #include "rust-unused-collector.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Analysis {
@@ -33,7 +33,7 @@ public:
   void go (HIR::Crate &crate);
 
 private:
-  const Resolver2_0::NameResolutionContext &nr_context;
+  const Resolver2_0::FinalizedNameResolutionContext &nr_context;
   Analysis::Mappings &mappings;
   UnusedContext unused_context;
 
diff --git a/gcc/rust/checks/lints/unused/rust-unused-collector.cc 
b/gcc/rust/checks/lints/unused/rust-unused-collector.cc
index 6767678c6..542bab0a6 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-collector.cc
+++ b/gcc/rust/checks/lints/unused/rust-unused-collector.cc
@@ -22,13 +22,12 @@
 #include "rust-hir-item.h"
 #include "rust-hir-path.h"
 #include "rust-hir-pattern.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Analysis {
 UnusedCollector::UnusedCollector (UnusedContext &context)
-  : nr_context (
-    Resolver2_0::ImmutableNameResolutionContext::get ().resolver ()),
+  : nr_context (Resolver2_0::FinalizedNameResolutionContext::get ()),
     mappings (Analysis::Mappings::get ()), unused_context (context)
 {}
 void
diff --git a/gcc/rust/checks/lints/unused/rust-unused-collector.h 
b/gcc/rust/checks/lints/unused/rust-unused-collector.h
index 1944089d1..581a9fcbd 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-collector.h
+++ b/gcc/rust/checks/lints/unused/rust-unused-collector.h
@@ -21,7 +21,7 @@
 #include "rust-hir-pattern.h"
 #include "rust-hir-visitor.h"
 #include "rust-mapping-common.h"
-#include "rust-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-unused-context.h"
 
 namespace Rust {
@@ -33,7 +33,7 @@ public:
   void go (HIR::Crate &crate);
 
 private:
-  const Resolver2_0::NameResolutionContext &nr_context;
+  const Resolver2_0::FinalizedNameResolutionContext &nr_context;
   Analysis::Mappings &mappings;
   UnusedContext &unused_context;
 
diff --git a/gcc/rust/resolve/rust-immutable-name-resolution-context.cc 
b/gcc/rust/resolve/rust-finalized-name-resolution-context.cc
similarity index 50%
rename from gcc/rust/resolve/rust-immutable-name-resolution-context.cc
rename to gcc/rust/resolve/rust-finalized-name-resolution-context.cc
index 1de66d8c4..ea60f95fb 100644
--- a/gcc/rust/resolve/rust-immutable-name-resolution-context.cc
+++ b/gcc/rust/resolve/rust-finalized-name-resolution-context.cc
@@ -16,39 +16,54 @@
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Resolver2_0 {
 
-static ImmutableNameResolutionContext *instance = nullptr;
+static FinalizedNameResolutionContext *instance = nullptr;
 
-const ImmutableNameResolutionContext &
-ImmutableNameResolutionContext::init (const NameResolutionContext &ctx)
+const FinalizedNameResolutionContext &
+FinalizedNameResolutionContext::init (NameResolutionContext &ctx)
 {
   rust_assert (!instance);
 
-  instance = new ImmutableNameResolutionContext (ctx);
+  instance = new FinalizedNameResolutionContext (ctx);
 
   return *instance;
 }
 
-const ImmutableNameResolutionContext &
-ImmutableNameResolutionContext::get ()
+FinalizedNameResolutionContext &
+FinalizedNameResolutionContext::get ()
 {
   rust_assert (instance);
 
   return *instance;
 }
 
-const NameResolutionContext &
-ImmutableNameResolutionContext::resolver () const
+void
+FinalizedNameResolutionContext::map_usage (Usage usage, Definition definition)
 {
-  return ctx;
+  auto leaf_definition
+    = ctx.find_leaf_definition (definition.id).value_or (definition);
+
+  ctx.map_usage (usage, leaf_definition);
+}
+
+tl::optional<NodeId>
+FinalizedNameResolutionContext::lookup (NodeId usage) const
+{
+  return ctx.lookup (usage);
+}
+
+Resolver::CanonicalPath
+FinalizedNameResolutionContext::to_canonical_path (NodeId id) const
+{
+  return ctx.canonical_ctx.get_path (id);
 }
 
-ImmutableNameResolutionContext::ImmutableNameResolutionContext (
-  const NameResolutionContext &ctx)
+FinalizedNameResolutionContext::FinalizedNameResolutionContext (
+  NameResolutionContext &ctx)
   : ctx (ctx)
 {}
 
diff --git a/gcc/rust/resolve/rust-finalized-name-resolution-context.h 
b/gcc/rust/resolve/rust-finalized-name-resolution-context.h
new file mode 100644
index 000000000..a896423bf
--- /dev/null
+++ b/gcc/rust/resolve/rust-finalized-name-resolution-context.h
@@ -0,0 +1,80 @@
+// Copyright (C) 2020-2026 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef RUST_FINALIZED_NRCTX_H
+#define RUST_FINALIZED_NRCTX_H
+
+#include "rust-name-resolution-context.h"
+
+namespace Rust {
+namespace Resolver2_0 {
+
+/**
+ * Once the name resolution pass is complete, the typechecker can access it
+ *
+ * FIXME: More documentation
+ */
+class FinalizedNameResolutionContext
+{
+public:
+  /** FIXME: Documentation */
+  static const FinalizedNameResolutionContext &
+  init (NameResolutionContext &ctx);
+
+  /** FIXME: Documentation */
+  static FinalizedNameResolutionContext &get ();
+
+  /**
+   * The exact same method as NameResolutionContext::map_usage, but this one
+   * uses the leafmost definition by default - as we are past the name
+   * resolution stage, every import chain has been resolved, and can be 
followed
+   * to an actual definition instead of an import definition
+   */
+  void map_usage (Usage usage, Definition definition);
+
+  /**
+   * Same as NameResolutionContext::lookup
+   */
+  tl::optional<NodeId> lookup (NodeId usage) const;
+
+  /**
+   * Same as NameResolutionContext::to_canonical_path
+   */
+  Resolver::CanonicalPath to_canonical_path (NodeId id) const;
+
+  /**
+   * Avoid using these and prefer adding wrapper methods to this class instead.
+   *
+   * Let's limit the number of times we use these, and eventually try to remove
+   * them.
+   */
+  const NameResolutionContext &get_underlying () const { return ctx; }
+  NameResolutionContext &get_underlying () { return ctx; }
+
+private:
+  FinalizedNameResolutionContext (NameResolutionContext &ctx);
+  FinalizedNameResolutionContext (const FinalizedNameResolutionContext &other)
+    = default;
+
+  NameResolutionContext &ctx;
+};
+
+} // namespace Resolver2_0
+} // namespace Rust
+
+#endif //! RUST_FINALIZED_NRCTX_H
diff --git a/gcc/rust/resolve/rust-immutable-name-resolution-context.h 
b/gcc/rust/resolve/rust-immutable-name-resolution-context.h
deleted file mode 100644
index 626b12ab4..000000000
--- a/gcc/rust/resolve/rust-immutable-name-resolution-context.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2020-2026 Free Software Foundation, Inc.
-
-// This file is part of GCC.
-
-// GCC is free software; you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 3, or (at your option) any later
-// version.
-
-// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-// WARRANTY; without even the implied warranty of MERCHANTABILITY or
-// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-// for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING3.  If not see
-// <http://www.gnu.org/licenses/>.
-
-#ifndef RUST_IMMUTABLE_NRCTX_H
-#define RUST_IMMUTABLE_NRCTX_H
-
-#include "rust-name-resolution-context.h"
-
-namespace Rust {
-namespace Resolver2_0 {
-
-/**
- * Once the name resolution pass is complete, the typechecker can access it
- *
- * FIXME: More documentation
- */
-class ImmutableNameResolutionContext
-{
-public:
-  /** FIXME: Documentation */
-  static const ImmutableNameResolutionContext &
-  init (const NameResolutionContext &ctx);
-
-  /** FIXME: Documentation */
-  static const ImmutableNameResolutionContext &get ();
-
-  const NameResolutionContext &resolver () const;
-
-private:
-  ImmutableNameResolutionContext (const NameResolutionContext &ctx);
-  ImmutableNameResolutionContext (const ImmutableNameResolutionContext &other)
-    = default;
-
-  const NameResolutionContext &ctx;
-};
-
-} // namespace Resolver2_0
-} // namespace Rust
-
-#endif //! RUST_IMMUTABLE_NRCTX_H
diff --git a/gcc/rust/resolve/rust-name-resolution-context.h 
b/gcc/rust/resolve/rust-name-resolution-context.h
index f58f130a1..f574bec51 100644
--- a/gcc/rust/resolve/rust-name-resolution-context.h
+++ b/gcc/rust/resolve/rust-name-resolution-context.h
@@ -798,9 +798,9 @@ public:
    * FIXME: The documentation is wrong, this needs to also run after all usages
    * have been *resolved* so after Late as well!!!
    *
-   * TODO: Should this return something like the ImmutableNameResolutionCtx? Or
+   * TODO: Should this return something like the FinalizedNameResolutionCtx? Or
    * set it up at least? And instead of mutating the `resolved_nodes` map,
-   * create a new one for the ImmutableNameResolutionCtx?
+   * create a new one for the FinalizedNameResolutionCtx?
    * Actually, since Late uses the NRCtx directly we should mutate this. Most
    * later passes don't look at this map. So let's go for side-effects in a 
void
    * function, yipee.
diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index 8a6d28882..e680d2b65 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -24,7 +24,7 @@
 #include "rust-diagnostics.h"
 #include "rust-expression-yeast.h"
 #include "rust-hir-pattern-analysis.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-location.h"
 #include "rust-unsafe-checker.h"
 #include "rust-lex.h"
@@ -800,7 +800,7 @@ Session::compile_crate (const char *filename)
     return;
 
   // name resolution is done, we now freeze the name resolver for type checking
-  Resolver2_0::ImmutableNameResolutionContext::init (name_resolution_ctx);
+  Resolver2_0::FinalizedNameResolutionContext::init (name_resolution_ctx);
 
   // type resolve
   Compile::Context *ctx = Compile::Context::get ();
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc 
b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index dbc935ac4..0d99eb7e9 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -20,7 +20,7 @@
 #include "rust-hir-type-check-expr.h"
 #include "rust-substitution-mapper.h"
 #include "rust-type-util.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Resolver {
@@ -120,8 +120,7 @@ bool
 TraitResolver::resolve_path_to_trait (const HIR::TypePath &path,
                                      HIR::Trait **resolved) const
 {
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   NodeId ref;
   if (auto ref_opt = nr_ctx.lookup (path.get_mappings ().get_nodeid ()))
diff --git a/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc 
b/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
index ce31d8bba..8566bcd7d 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
@@ -21,7 +21,7 @@
 #include "rust-hir-type-check-expr.h"
 #include "rust-hir-type-check-enumitem.h"
 #include "rust-type-util.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Resolver {
@@ -76,8 +76,7 @@ TypeCheckEnumItem::visit (HIR::EnumItem &item)
   rust_assert (ok);
   context->insert_type (mapping, isize);
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
@@ -108,8 +107,7 @@ TypeCheckEnumItem::visit (HIR::EnumItemDiscriminant &item)
              TyTy::TyWithLocation (expected_ty),
              TyTy::TyWithLocation (capacity_type), item.get_locus ());
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
@@ -158,8 +156,7 @@ TypeCheckEnumItem::visit (HIR::EnumItemTuple &item)
   rust_assert (ok);
   context->insert_type (mapping, isize);
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
@@ -206,8 +203,7 @@ TypeCheckEnumItem::visit (HIR::EnumItemStruct &item)
   rust_assert (ok);
   context->insert_type (mapping, isize);
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (item.get_mappings ().get_nodeid ());
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc 
b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index 327144f3f..897057040 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -19,6 +19,7 @@
 #include "optional.h"
 #include "rust-common.h"
 #include "rust-hir-expr.h"
+#include "rust-hir-map.h"
 #include "rust-system.h"
 #include "rust-tyty-call.h"
 #include "rust-hir-type-check-struct-field.h"
@@ -31,7 +32,7 @@
 #include "rust-hir-type-check-stmt.h"
 #include "rust-hir-type-check-item.h"
 #include "rust-type-util.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-compile-base.h"
 #include "rust-tyty-util.h"
 #include "rust-tyty.h"
@@ -1535,8 +1536,7 @@ TypeCheckExpr::visit (HIR::MethodCallExpr &expr)
   // store the expected fntype
   context->insert_type (expr.get_method_name ().get_mappings (), lookup);
 
-  auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
-    Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
                    Resolver2_0::Definition (resolved_node_id));
@@ -1885,10 +1885,9 @@ TypeCheckExpr::visit (HIR::ClosureExpr &expr)
   // Resolve closure captures
 
   std::set<NodeId> captures;
-  auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
-    Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());
 
-  if (auto opt_cap = nr_ctx.mappings.lookup_captures (closure_node_id))
+  if (auto opt_cap
+      = Analysis::Mappings::get ().lookup_captures (closure_node_id))
     for (auto cap : opt_cap.value ())
       captures.insert (cap);
 
@@ -2180,8 +2179,7 @@ TypeCheckExpr::resolve_operator_overload (
   context->insert_operator_overload (expr.get_mappings ().get_hirid (), type);
 
   // set up the resolved name on the path
-  auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
-    Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
                    Resolver2_0::Definition (resolved_node_id));
@@ -2376,8 +2374,7 @@ TypeCheckExpr::resolve_fn_trait_call (HIR::CallExpr &expr,
   context->insert_operator_overload (expr.get_mappings ().get_hirid (), fn);
 
   // set up the resolved name on the path
-  auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
-    Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   auto existing = nr_ctx.lookup (expr.get_mappings ().get_nodeid ());
   if (existing)
diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc 
b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
index 28ee95d7c..85ccd60a4 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
@@ -26,7 +26,7 @@
 #include "rust-hir-type-check-pattern.h"
 #include "rust-type-util.h"
 #include "rust-tyty.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Resolver {
@@ -339,8 +339,7 @@ TypeCheckImplItem::visit (HIR::Function &function)
                           param_tyty);
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid ());
@@ -400,8 +399,7 @@ TypeCheckImplItem::visit (HIR::ConstantItem &constant)
     }
 
   // special case when this is a generic constant
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
   CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (constant.get_mappings ().get_nodeid ());
   RustIdent ident{canonical_path, constant.get_locus ()};
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc 
b/gcc/rust/typecheck/rust-hir-type-check-item.cc
index f2a40c6c7..db6682fd3 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc
@@ -29,7 +29,7 @@
 #include "rust-hir-trait-resolve.h"
 #include "rust-identifier.h"
 #include "rust-session-manager.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-substitution-mapper.h"
 #include "rust-type-util.h"
 #include "rust-tyty-variance-analysis.h"
@@ -205,8 +205,7 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl)
 
   // get the path
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath path
     = nr_ctx.to_canonical_path (struct_decl.get_mappings ().get_nodeid ());
@@ -274,8 +273,7 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl)
       context->insert_type (field.get_mappings (), ty_field->get_field_type 
());
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath path
     = nr_ctx.to_canonical_path (struct_decl.get_mappings ().get_nodeid ());
@@ -352,8 +350,7 @@ TypeCheckItem::visit (HIR::Enum &enum_decl)
        }
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   // get the path
   CanonicalPath canonical_path
@@ -405,8 +402,7 @@ TypeCheckItem::visit (HIR::Union &union_decl)
                            ty_variant->get_field_type ());
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   // get the path
   CanonicalPath canonical_path
@@ -570,8 +566,7 @@ TypeCheckItem::visit (HIR::Function &function)
                           param_tyty);
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath path
     = nr_ctx.to_canonical_path (function.get_mappings ().get_nodeid ());
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index edef4a302..f4405f37b 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -29,7 +29,7 @@
 #include "rust-hir-type-bounds.h"
 #include "rust-hir-item.h"
 #include "rust-session-manager.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 namespace Rust {
 namespace Resolver {
@@ -157,8 +157,7 @@ TypeCheckExpr::visit (HIR::QualifiedPathInExpression &expr)
   bool fully_resolved = expr.get_segments ().size () <= 1;
   if (fully_resolved)
     {
-      auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
-       Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());
+      auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
       nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid 
()),
                        Resolver2_0::Definition (root_resolved_node_id));
@@ -255,8 +254,7 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression 
&expr, size_t *offset,
       bool is_root = *offset == 0;
       NodeId ast_node_id = seg.get_mappings ().get_nodeid ();
 
-      auto &nr_ctx
-       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+      auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
       // lookup the reference_node_id
       NodeId ref_node_id;
@@ -544,8 +542,7 @@ TypeCheckExpr::resolve_segments (NodeId 
root_resolved_node_id,
 
   rust_assert (resolved_node_id != UNKNOWN_NODEID);
 
-  auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
-    Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   nr_ctx.map_usage (Resolver2_0::Usage (expr_mappings.get_nodeid ()),
                    Resolver2_0::Definition (resolved_node_id));
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index d6117c38f..6cc14e019 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -21,7 +21,7 @@
 #include "rust-hir-type-check-expr.h"
 #include "rust-token.h"
 #include "rust-type-util.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-tyty.h"
 #include "tree.h"
 
@@ -54,8 +54,7 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern)
   NodeId ref_node_id = UNKNOWN_NODEID;
   bool maybe_item = false;
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   if (auto id = nr_ctx.lookup (pattern.get_mappings ().get_nodeid ()))
     {
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index af48e69a4..4bc73ada0 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -24,7 +24,7 @@
 #include "rust-hir-type-check-expr.h"
 #include "rust-hir-path-probe.h"
 #include "rust-hir-type-bounds.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "rust-mapping-common.h"
 #include "rust-substitution-mapper.h"
 #include "rust-type-util.h"
@@ -343,8 +343,7 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, 
size_t *offset,
          seg->get_lang_item ());
       else
        {
-         auto &nr_ctx
-           = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+         auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
          // assign the ref_node_id if we've found something
          nr_ctx.lookup (ast_node_id).map ([&ref_node_id] (NodeId resolved) {
@@ -1108,8 +1107,7 @@ ResolveWhereClauseItem::visit 
(HIR::TypeBoundWhereClauseItem &item)
   // then lookup the reference_node_id
   NodeId ref_node_id = UNKNOWN_NODEID;
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   if (auto id = nr_ctx.lookup (ast_node_id))
     {
diff --git a/gcc/rust/typecheck/rust-hir-type-check.cc 
b/gcc/rust/typecheck/rust-hir-type-check.cc
index 7c5aef461..49f3aeb68 100644
--- a/gcc/rust/typecheck/rust-hir-type-check.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check.cc
@@ -24,7 +24,7 @@
 #include "rust-hir-type-check-item.h"
 #include "rust-hir-type-check-pattern.h"
 #include "rust-hir-type-check-struct-field.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 
 extern bool saw_errors (void);
 
@@ -275,8 +275,7 @@ TraitItemReference::get_type_from_fn (/*const*/ 
HIR::TraitItemFunc &fn) const
                           param_tyty);
     }
 
-  auto &nr_ctx
-    = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+  auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
   CanonicalPath canonical_path
     = nr_ctx.to_canonical_path (fn.get_mappings ().get_nodeid ());
diff --git a/gcc/rust/typecheck/rust-type-util.cc 
b/gcc/rust/typecheck/rust-type-util.cc
index 6d4567cec..d59e5f0c0 100644
--- a/gcc/rust/typecheck/rust-type-util.cc
+++ b/gcc/rust/typecheck/rust-type-util.cc
@@ -28,7 +28,7 @@
 #include "rust-unify.h"
 #include "rust-coercion.h"
 #include "rust-hir-type-bounds.h"
-#include "rust-immutable-name-resolution-context.h"
+#include "rust-finalized-name-resolution-context.h"
 #include "options.h"
 
 namespace Rust {
@@ -103,8 +103,7 @@ query_type (HirId reference, TyTy::BaseType **result)
          NodeId ref_node_id = UNKNOWN_NODEID;
          NodeId ast_node_id = ty.get_mappings ().get_nodeid ();
 
-         auto &nr_ctx
-           = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+         auto &nr_ctx = Resolver2_0::FinalizedNameResolutionContext::get ();
 
          // assign the ref_node_id if we've found something
          nr_ctx.lookup (ast_node_id).map ([&ref_node_id] (NodeId resolved) {
-- 
2.54.0

Reply via email to