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

[email protected]
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.rust
Message-ID <[email protected]>
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.