[COMMITTED 65/77] gccrs: Generalize prelude import handling

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Fri Aug 7 12:39:56 GMT 2026


From: Owen Avery <powerboat9.gamer@gmail.com>

Replace some ad-hoc handling of prelude imports with a glob import in
every module/crate.

gcc/rust/ChangeLog:

	* resolve/rust-default-resolver.cc
	(DefaultResolver::visit (Crate)): Call maybe_prelude_import.
	(DefaultResolver::visit (Module)): Likewise.
	* resolve/rust-default-resolver.h
	(DefaultResolver::maybe_prelude_import): New virtual member
	function.
	* resolve/rust-early-name-resolver-2.0.cc
	(Early::maybe_prelude_import): New member function definition.
	(Early::finalize_glob_import): Mark visitor as dirty when
	first setting ctx.prelude.
	* resolve/rust-early-name-resolver-2.0.h
	(Early::maybe_prelude_import): New member function declaration.
	* resolve/rust-late-name-resolver-2.0.cc
	(Late::visit (IdentifierExpr)): Remove ad-hoc prelude import
	handling.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
---
 gcc/rust/resolve/rust-default-resolver.cc     | 11 +++++++---
 gcc/rust/resolve/rust-default-resolver.h      |  1 +
 .../resolve/rust-early-name-resolver-2.0.cc   | 20 +++++++++++++++++++
 .../resolve/rust-early-name-resolver-2.0.h    |  1 +
 .../resolve/rust-late-name-resolver-2.0.cc    | 11 ----------
 5 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc
index 9b23ab38bc2..7a54c6ee134 100644
--- a/gcc/rust/resolve/rust-default-resolver.cc
+++ b/gcc/rust/resolve/rust-default-resolver.cc
@@ -36,7 +36,10 @@ DefaultResolver::visit (AST::Crate &crate)
   if (!visited_crates.insert (crate.get_node_id ()).second)
     return;
 
-  auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); };
+  auto inner_fn = [this, &crate] () {
+    maybe_prelude_import ();
+    AST::DefaultASTVisitor::visit (crate);
+  };
 
   auto &mappings = Analysis::Mappings::get ();
 
@@ -62,8 +65,10 @@ DefaultResolver::visit (AST::BlockExpr &expr)
 void
 DefaultResolver::visit (AST::Module &module)
 {
-  auto item_fn_1
-    = [this, &module] () { AST::DefaultASTVisitor::visit (module); };
+  auto item_fn_1 = [this, &module] () {
+    maybe_prelude_import ();
+    AST::DefaultASTVisitor::visit (module);
+  };
 
   auto item_fn_2 = [this, &module, &item_fn_1] () {
     ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
diff --git a/gcc/rust/resolve/rust-default-resolver.h b/gcc/rust/resolve/rust-default-resolver.h
index 2d53ff3a73b..bd2bab9f8ca 100644
--- a/gcc/rust/resolve/rust-default-resolver.h
+++ b/gcc/rust/resolve/rust-default-resolver.h
@@ -45,6 +45,7 @@ public:
   // these nodes create new scopes and ribs - they are often used to declare new
   // variables, such as a for loop's iterator, or a function's arguments
   void visit (AST::BlockExpr &) override;
+  virtual void maybe_prelude_import () {}
   void visit (AST::Module &) override;
   void visit (AST::Function &) override;
   void visit (AST::LoopExpr &expr) override;
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
index 12f29ceed7c..56f91db89dc 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -313,6 +313,22 @@ Early::visit (AST::Module &module)
     textual_scope.pop ();
 }
 
+void
+Early::maybe_prelude_import ()
+{
+  // handle prelude import
+  if (ctx.prelude)
+    {
+      auto container = Analysis::Mappings::get ().lookup_glob_container (
+	ctx.prelude.value ());
+      rust_assert (container);
+
+      GlobbingVisitor glob_visit (ctx);
+      glob_visit.go (container.value ());
+      dirty |= glob_visit.is_dirty ();
+    }
+}
+
 void
 Early::visit (AST::MacroInvocation &invoc)
 {
@@ -489,6 +505,10 @@ Early::finalize_glob_import (NameResolutionContext &ctx,
       rust_assert (container.value ()->get_glob_container_kind ()
 		   == AST::GlobContainer::Kind::Module);
 
+      // TODO: catch multiple attempted prelude imports
+      if (!ctx.prelude)
+	dirty = true;
+
       ctx.prelude = mapping.data.container ().get_node_id ();
     }
 
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.h b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
index 7ea9e9f2ccc..f2297d58eb8 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.h
@@ -59,6 +59,7 @@ public:
 
   // as well as lexical scopes
   void visit (AST::BlockExpr &) override;
+  void maybe_prelude_import () override;
   void visit (AST::Module &) override;
 
   void visit (AST::MacroInvocation &) override;
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
index c6ae6ffa1bf..e910c7e3b26 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -369,17 +369,6 @@ Late::visit (AST::IdentifierExpr &expr)
 	  resolved = type;
 	  ns = Namespace::Types;
 	}
-      else if (!resolved && ctx.prelude)
-	{
-	  resolved
-	    = ctx.values.get_from_prelude (*ctx.prelude, expr.get_ident ());
-	  ns = Namespace::Values;
-
-	  if (!resolved)
-	    resolved
-	      = ctx.types.get_from_prelude (*ctx.prelude, expr.get_ident ());
-	  ns = Namespace::Types;
-	}
 
       if (!resolved)
 	{
-- 
2.50.1



More information about the Gcc-rust mailing list