Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion gcc/rust/expand/rust-expand-visitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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>>
Expand All @@ -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:
Expand Down
12 changes: 12 additions & 0 deletions gcc/rust/util/rust-hir-map.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
5 changes: 5 additions & 0 deletions gcc/rust/util/rust-hir-map.h
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,9 @@ class Mappings
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 ();

Expand Down Expand Up @@ -443,6 +446,8 @@ class Mappings

// Closure AST NodeId -> vector of Definition node ids
std::unordered_map<NodeId, std::vector<NodeId>> captures;

std::set<NodeId> derived_nodes;
};

} // namespace Analysis
Expand Down
Loading