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

gcc/rust/ChangeLog:

        * resolve/rust-default-resolver.cc
        (DefaultResolver::visit_closure_params): New member function
        definition.
        (DefaultResolver::visit): New visiting function definition for
        ClosureExpr called from visiting functions for ClosureExprInner
        and ClosureExprInnerTyped.
        * resolve/rust-default-resolver.h
        (DefaultResolver::visit_closure_params): New member function
        declaration.
        (DefaultResolver::visit): New visiting function declaration for
        ClosureExpr.
        * resolve/rust-late-name-resolver-2.0.cc (add_captures): Remove
        function.
        (Late::visit): New visiting function definition for ClosureExpr,
        remove visiting function definitions for ClosureExprInner and
        ClosureExprInnerTyped.
        (Late::visit_closure_params): New member function definition.
        * resolve/rust-late-name-resolver-2.0.h (Late::visit): New
        visiting function declaration for ClosureExpr, remove visiting
        function declarations for ClosureExprInner and
        ClosureExprInnerTyped.
        (Late::visit_closure_params): New member function declaration.

Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>
---
 gcc/rust/resolve/rust-default-resolver.cc     | 25 ++++++++++-
 gcc/rust/resolve/rust-default-resolver.h      |  2 +
 .../resolve/rust-late-name-resolver-2.0.cc    | 44 +++++--------------
 .../resolve/rust-late-name-resolver-2.0.h     |  4 +-
 4 files changed, 37 insertions(+), 38 deletions(-)

diff --git a/gcc/rust/resolve/rust-default-resolver.cc 
b/gcc/rust/resolve/rust-default-resolver.cc
index 969711c2995..01906cf0a32 100644
--- a/gcc/rust/resolve/rust-default-resolver.cc
+++ b/gcc/rust/resolve/rust-default-resolver.cc
@@ -292,13 +292,33 @@ DefaultResolver::visit (AST::TypeAlias &type)
              inner_fn_2, type.get_new_type_name ());
 }
 
+void
+DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
+{
+  for (auto &param : expr.get_params ())
+    visit (param);
+}
+
+void
+DefaultResolver::visit (AST::ClosureExpr &expr)
+{
+  auto expr_fn = [this, &expr] () {
+    visit_closure_params (expr);
+    visit (expr.get_definition_expr ());
+  };
+
+  visit_outer_attrs (expr);
+
+  ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
+}
+
 void
 DefaultResolver::visit (AST::ClosureExprInner &expr)
 {
   if (expr.is_marked_for_strip ())
     return;
 
-  AST::DefaultASTVisitor::visit (expr);
+  visit (static_cast<AST::ClosureExpr &> (expr));
 }
 
 void
@@ -307,7 +327,8 @@ DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
   if (expr.is_marked_for_strip ())
     return;
 
-  AST::DefaultASTVisitor::visit (expr);
+  visit (static_cast<AST::ClosureExpr &> (expr));
+  visit (expr.get_return_type ());
 }
 
 void
diff --git a/gcc/rust/resolve/rust-default-resolver.h 
b/gcc/rust/resolve/rust-default-resolver.h
index e80d77440b1..99fd8e77a48 100644
--- a/gcc/rust/resolve/rust-default-resolver.h
+++ b/gcc/rust/resolve/rust-default-resolver.h
@@ -70,6 +70,8 @@ public:
   void visit (AST::TypeAlias &) override;
 
   // Visitors that visit their expression node(s)
+  virtual void visit_closure_params (AST::ClosureExpr &);
+  virtual void visit (AST::ClosureExpr &);
   void visit (AST::ClosureExprInner &) override;
   void visit (AST::ClosureExprInnerTyped &) override;
   void visit (AST::MatchExpr &) 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 51874bbb562..3c1c346cf14 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -693,51 +693,27 @@ Late::visit (AST::GenericArg &arg)
   DefaultResolver::visit (arg);
 }
 
-template <class Closure>
-static void
-add_captures (Closure &closure, NameResolutionContext &ctx)
-{
-  auto vals = ctx.values.peek ().get_values ();
-  for (auto &val : vals)
-    {
-      ctx.mappings.add_capture (closure.get_node_id (),
-                               val.second.get_node_id ());
-    }
-}
-
 void
-Late::visit (AST::ClosureExprInner &closure)
+Late::visit_closure_params (AST::ClosureExpr &closure)
 {
-  add_captures (closure, ctx);
-
-  visit_outer_attrs (closure);
-
   ctx.bindings.enter (BindingSource::Param);
 
-  for (auto &param : closure.get_params ())
-    visit (param);
+  DefaultResolver::visit_closure_params (closure);
 
   ctx.bindings.exit ();
-
-  visit (closure.get_definition_expr ());
 }
 
 void
-Late::visit (AST::ClosureExprInnerTyped &closure)
+Late::visit (AST::ClosureExpr &expr)
 {
-  add_captures (closure, ctx);
-
-  visit_outer_attrs (closure);
-
-  ctx.bindings.enter (BindingSource::Param);
-
-  for (auto &param : closure.get_params ())
-    visit (param);
-
-  ctx.bindings.exit ();
+  // add captures
+  auto vals = ctx.values.peek ().get_values ();
+  for (auto &val : vals)
+    {
+      ctx.mappings.add_capture (expr.get_node_id (), val.second.get_node_id 
());
+    }
 
-  visit (closure.get_return_type ());
-  visit (closure.get_definition_expr ());
+  DefaultResolver::visit (expr);
 }
 
 } // namespace Resolver2_0
diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.h 
b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
index ddf14ff4940..f2907c90514 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
@@ -69,8 +69,8 @@ public:
   void visit (AST::StructStruct &) override;
   void visit (AST::GenericArgs &) override;
   void visit (AST::GenericArg &);
-  void visit (AST::ClosureExprInner &) override;
-  void visit (AST::ClosureExprInnerTyped &) override;
+  void visit_closure_params (AST::ClosureExpr &) override;
+  void visit (AST::ClosureExpr &) override;
 
 private:
   void resolve_label (AST::Lifetime &lifetime);
-- 
2.49.0

Reply via email to