]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add derived set to collect derived nodes.
authorRyutaro Okada <1015ryu88@gmail.com>
Fri, 8 Aug 2025 15:02:19 +0000 (08:02 -0700)
committerArthur Cohen <arthur.cohen@embecosm.com>
Wed, 3 Dec 2025 12:25:46 +0000 (13:25 +0100)
gcc/rust/ChangeLog:

* expand/rust-expand-visitor.cc (builtin_derive_item): Collect derived nodes.
(derive_item): Collect derived nodes.
* util/rust-hir-map.cc (Mappings::add_derived_nodes): Add derived set to collect derived
nodes.
(Mappings::is_derived_node): Add derived set to collect derived nodes.
* util/rust-hir-map.h: Add derived set to collect derived nodes.

Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
gcc/rust/expand/rust-expand-visitor.cc
gcc/rust/util/rust-hir-map.cc
gcc/rust/util/rust-hir-map.h

index 4593cc3f930853f666818f724b0629122b130592..6e98a5c3724edbaadaae978c65037464abdc808a 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "rust-expand-visitor.h"
 #include "rust-ast-fragment.h"
+#include "rust-hir-map.h"
 #include "rust-item.h"
 #include "rust-proc-macro.h"
 #include "rust-attributes.h"
@@ -48,7 +49,10 @@ static std::vector<std::unique_ptr<AST::Item>>
 builtin_derive_item (AST::Item &item, const AST::Attribute &derive,
                     BuiltinMacro to_derive)
 {
-  return AST::DeriveVisitor::derive (item, derive, to_derive);
+  auto items = AST::DeriveVisitor::derive (item, derive, to_derive);
+  for (auto &item : items)
+    Analysis::Mappings::get ().add_derived_node (item->get_node_id ());
+  return items;
 }
 
 static std::vector<std::unique_ptr<AST::Item>>
@@ -64,6 +68,8 @@ derive_item (AST::Item &item, AST::SimplePath &to_derive,
          switch (node.get_kind ())
            {
            case AST::SingleASTNode::Kind::Item:
+             Analysis::Mappings::get ().add_derived_node (
+               node.get_item ()->get_node_id ());
              result.push_back (node.take_item ());
              break;
            default:
index 1587c7ee7a22530316af2cc2bafe2ba698b5b36b..a6d323e361444f135c0d09b996f44b88806e6478 100644 (file)
@@ -1358,5 +1358,17 @@ Mappings::lookup_captures (NodeId closure)
     return cap->second;
 }
 
+void
+Mappings::add_derived_node (NodeId node_id)
+{
+  derived_nodes.insert (node_id);
+}
+
+bool
+Mappings::is_derived_node (NodeId node_id)
+{
+  return derived_nodes.find (node_id) != derived_nodes.end ();
+}
+
 } // namespace Analysis
 } // namespace Rust
index 8a284cb938bd424ae4b9f2b909820ed0cc796b27..60066d6cdd0975682ffd51a8313301254eb8510b 100644 (file)
@@ -350,6 +350,9 @@ public:
   void add_capture (NodeId closure, NodeId definition);
   tl::optional<std::vector<NodeId>> lookup_captures (NodeId closure);
 
+  void add_derived_node (NodeId node_id);
+  bool is_derived_node (NodeId node_id);
+
 private:
   Mappings ();
 
@@ -443,6 +446,8 @@ private:
 
   // Closure AST NodeId -> vector of Definition node ids
   std::unordered_map<NodeId, std::vector<NodeId>> captures;
+
+  std::set<NodeId> derived_nodes;
 };
 
 } // namespace Analysis