aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc2
-rw-r--r--gcc/rust/resolve/rust-name-resolver.h27
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