From: Owen Avery <[email protected]>
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 <[email protected]>
---
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/ab5ba74bab35eecfc3eb0893354cdeec22280821
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/4729
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 9b23ab38b..7a54c6ee1 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 2d53ff3a7..bd2bab9f8 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 12f29ceed..56f91db89 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 7ea9e9f2c..f2297d58e 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 c6ae6ffa1..e910c7e3b 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)
{
base-commit: 7791037cb7f88f24634039e062ca4f0382a13504
--
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.