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]>
---
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
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.