https://gcc.gnu.org/g:f171589e748634e4c781ce64e4b3b2d667d17400

commit r16-233-gf171589e748634e4c781ce64e4b3b2d667d17400
Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
Date:   Sat Apr 19 14:14:25 2025 +0200

    gccrs: Use specialized param visit function for params
    
    This commit introduce a new public function to visit function parameters
    in the default visitor. It allows visitors derived from DefaultVisitor
    to override only a small part of the default visitor.
    
    gcc/rust/ChangeLog:
    
            * ast/rust-ast-visitor.cc 
(DefaultASTVisitor::visit_function_params):
            Add specialized function to visit function parameters.
            (DefaultASTVisitor::visit): Remove parameter visit and call 
specialized
            function instead.
            * ast/rust-ast-visitor.h: Add function prototye.
            * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Remove
            function.
            (Late::visit_function_params): Override specialized visit function.
            * resolve/rust-late-name-resolver-2.0.h: Add overriden function
            prototype.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>

Diff:
---
 gcc/rust/ast/rust-ast-visitor.cc                | 12 ++++++++--
 gcc/rust/ast/rust-ast-visitor.h                 |  2 ++
 gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 30 +++++--------------------
 gcc/rust/resolve/rust-late-name-resolver-2.0.h  |  4 +++-
 4 files changed, 20 insertions(+), 28 deletions(-)

diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index 6862024354f2..87e7b86573ba 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -831,6 +831,13 @@ DefaultASTVisitor::visit (AST::UseDeclaration &use_decl)
   visit (use_decl.get_tree ());
 }
 
+void
+DefaultASTVisitor::visit_function_params (AST::Function &function)
+{
+  for (auto &param : function.get_function_params ())
+    visit (param);
+}
+
 void
 DefaultASTVisitor::visit (AST::Function &function)
 {
@@ -839,8 +846,9 @@ DefaultASTVisitor::visit (AST::Function &function)
   visit (function.get_qualifiers ());
   for (auto &generic : function.get_generic_params ())
     visit (generic);
-  for (auto &param : function.get_function_params ())
-    visit (param);
+
+  visit_function_params (function);
+
   if (function.has_return_type ())
     visit (function.get_return_type ());
   if (function.has_where_clause ())
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index 6d243e7b063e..b1fc50465a1a 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -242,6 +242,8 @@ public:
 class DefaultASTVisitor : public ASTVisitor
 {
 public:
+  virtual void visit_function_params (AST::Function &function);
+
   virtual void visit (AST::Crate &crate);
 
   virtual void visit (AST::Token &tok) 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 e26e4187b28f..6ec04229c8e7 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
@@ -266,34 +266,14 @@ Late::visit (AST::AltPattern &pattern)
 }
 
 void
-Late::visit (AST::Function &function)
+Late::visit_function_params (AST::Function &function)
 {
-  auto def_fn = [this, &function] () {
-    visit_outer_attrs (function);
-    visit (function.get_visibility ());
-    visit (function.get_qualifiers ());
-    for (auto &generic : function.get_generic_params ())
-      visit (generic);
-
-    // We only care about params
-    ctx.bindings.enter (BindingSource::Param);
-
-    for (auto &param : function.get_function_params ())
-      visit (param);
-
-    ctx.bindings.exit ();
-
-    // Back to regular visit
+  ctx.bindings.enter (BindingSource::Param);
 
-    if (function.has_return_type ())
-      visit (function.get_return_type ());
-    if (function.has_where_clause ())
-      visit (function.get_where_clause ());
-    if (function.has_body ())
-      visit (*function.get_definition ());
-  };
+  for (auto &param : function.get_function_params ())
+    visit (param);
 
-  ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn);
+  ctx.bindings.exit ();
 }
 
 void
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 9e2bfdefaad6..171d9bfe0f6e 100644
--- a/gcc/rust/resolve/rust-late-name-resolver-2.0.h
+++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.h
@@ -37,6 +37,9 @@ public:
 
   void new_label (Identifier name, NodeId id);
 
+  // Specialized visit bits
+  void visit_function_params (AST::Function &function) override;
+
   // some more label declarations
   void visit (AST::LetStmt &) override;
   // TODO: Do we need this?
@@ -44,7 +47,6 @@ public:
   void visit (AST::IdentifierPattern &) override;
   void visit (AST::StructPatternFieldIdent &) override;
   void visit (AST::AltPattern &) override;
-  void visit (AST::Function &) override;
   void visit (AST::SelfParam &) override;
   void visit (AST::MatchArm &) override;
   void visit (AST::ForLoopExpr &) override;

Reply via email to