diff options
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 2 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-name-resolver.h | 27 |
2 files changed, 24 insertions, 5 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc index 57bd0f3..ba4ee21 100644 --- a/gcc/rust/resolve/rust-ast-resolve.cc +++ b/gcc/rust/resolve/rust-ast-resolve.cc @@ -168,6 +168,7 @@ Resolver::insert_resolved_name (NodeId refId, NodeId defId) rust_assert (it == resolved_names.end ()); resolved_names[refId] = defId; + get_name_scope ().peek ()->append_reference_for_def (defId, refId); } bool @@ -188,6 +189,7 @@ Resolver::insert_resolved_type (NodeId refId, NodeId defId) rust_assert (it == resolved_types.end ()); resolved_types[refId] = defId; + get_type_scope ().peek ()->append_reference_for_def (defId, refId); } bool diff --git a/gcc/rust/resolve/rust-name-resolver.h b/gcc/rust/resolve/rust-name-resolver.h index 2aa592c..38206f6 100644 --- a/gcc/rust/resolve/rust-name-resolver.h +++ b/gcc/rust/resolve/rust-name-resolver.h @@ -41,6 +41,7 @@ public: { mappings[ident] = id; decls_within_rib.insert (id); + references[id] = {}; } bool lookup_name (std::string ident, NodeId *id) @@ -65,11 +66,30 @@ public: } } + void iterate_references_for_def (NodeId def, std::function<bool (NodeId)> cb) + { + auto it = references.find (def); + if (it == references.end ()) + return; + + for (auto ref : it->second) + { + if (!cb (ref)) + return; + } + } + + void append_reference_for_def (NodeId def, NodeId ref) + { + references[def].insert (ref); + } + private: CrateNum crate_num; NodeId node_id; std::map<std::string, NodeId> mappings; std::set<NodeId> decls_within_rib; + std::map<NodeId, std::set<NodeId> > references; }; class Scope @@ -135,8 +155,8 @@ private: // // if parent is UNKNOWN_NODEID then this is a root declaration // say the var_decl hasa node_id=4; -// the parent could be a BLOCK_Expr node_id but lets make it UNKNOWN_NODE_ID so -// we know when it terminates +// the parent could be a BLOCK_Expr node_id but lets make it UNKNOWN_NODE_ID +// so we know when it terminates struct Definition { NodeId node; @@ -211,9 +231,6 @@ private: // we need two namespaces one for names and ones for types std::map<NodeId, NodeId> resolved_names; std::map<NodeId, NodeId> resolved_types; - - std::map<NodeId, std::set<NodeId> > nameDefNodeIdToRibs; - std::map<NodeId, std::set<NodeId> > typeDefNodeIdToRibs; }; } // namespace Resolver |