[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