diff options
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-toplevel.h | 13 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 41 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.h | 10 |
3 files changed, 64 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-toplevel.h b/gcc/rust/resolve/rust-ast-resolve-toplevel.h index 7cfaa72..8d4e12b 100644 --- a/gcc/rust/resolve/rust-ast-resolve-toplevel.h +++ b/gcc/rust/resolve/rust-ast-resolve-toplevel.h @@ -41,6 +41,8 @@ public: ResolveTopLevel resolver (prefix, canonical_prefix, current_module); item->accept_vis (resolver); + resolver.mappings->insert_child_item_to_parent_module_mapping ( + item->get_node_id (), current_module); }; void visit (AST::Module &module) override @@ -62,6 +64,7 @@ public: Definition{module.get_node_id (), module.get_node_id ()}); + mappings->insert_module_child_item (current_module, mod); mappings->insert_module_child (current_module, module.get_node_id ()); for (auto &item : module.get_items ()) @@ -86,6 +89,7 @@ public: rust_error_at (r, "redefined multiple times"); }); + mappings->insert_module_child_item (current_module, talias); mappings->insert_canonical_path (mappings->get_current_crate (), alias.get_node_id (), cpath); } @@ -105,6 +109,7 @@ public: rust_error_at (r, "redefined multiple times"); }); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), struct_decl.get_node_id (), cpath); } @@ -127,6 +132,7 @@ public: for (auto &variant : enum_decl.get_variants ()) ResolveTopLevel::go (variant.get (), path, cpath, current_module); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), enum_decl.get_node_id (), cpath); } @@ -146,6 +152,7 @@ public: rust_error_at (r, "redefined multiple times"); }); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), item.get_node_id (), cpath); } @@ -222,6 +229,7 @@ public: rust_error_at (r, "redefined multiple times"); }); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), struct_decl.get_node_id (), cpath); } @@ -241,6 +249,7 @@ public: rust_error_at (r, "redefined multiple times"); }); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), union_decl.get_node_id (), cpath); } @@ -264,6 +273,7 @@ public: var.get_node_id ()}); resolver->mark_decl_mutability (var.get_node_id (), var.is_mutable ()); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), var.get_node_id (), cpath); } @@ -285,6 +295,7 @@ public: Definition{constant.get_node_id (), constant.get_node_id ()}); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), constant.get_node_id (), cpath); } @@ -314,6 +325,7 @@ public: function.get_node_id ()); } + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), function.get_node_id (), cpath); } @@ -391,6 +403,7 @@ public: for (auto &item : trait.get_trait_items ()) ResolveTopLevelTraitItems::go (item.get (), path, cpath); + mappings->insert_module_child_item (current_module, decl); mappings->insert_canonical_path (mappings->get_current_crate (), trait.get_node_id (), cpath); } diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 8672c8a..f9932a4 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -884,5 +884,46 @@ Mappings::lookup_module_children (NodeId module) return Optional<std::vector<NodeId> &>::some (it->second); } +void +Mappings::insert_module_child_item (NodeId module, + Resolver::CanonicalPath child) +{ + rust_assert (!child.is_empty ()); + rust_assert (child.get_node_id () != UNKNOWN_NODEID); + + auto it = module_child_items.find (module); + if (it == module_child_items.end ()) + module_child_items.insert ({module, {child}}); + else + it->second.emplace_back (child); +} + +Optional<std::vector<Resolver::CanonicalPath> &> +Mappings::lookup_module_chidren_items (NodeId module) +{ + auto it = module_child_items.find (module); + if (it == module_child_items.end ()) + return Optional<std::vector<Resolver::CanonicalPath> &>::none (); + + return Optional<std::vector<Resolver::CanonicalPath> &>::some (it->second); +} + +void +Mappings::insert_child_item_to_parent_module_mapping (NodeId child_item, + NodeId parent_module) +{ + child_to_parent_module_map.insert ({child_item, parent_module}); +} + +Optional<NodeId> +Mappings::lookup_parent_module (NodeId child_item) +{ + auto it = child_to_parent_module_map.find (child_item); + if (it == child_to_parent_module_map.end ()) + return Optional<NodeId>::none (); + + return Optional<NodeId>::some (it->second); +} + } // namespace Analysis } // namespace Rust diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 65f8661..a48d4be 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -326,6 +326,14 @@ public: void insert_module_child (NodeId module, NodeId child); Optional<std::vector<NodeId> &> lookup_module_children (NodeId module); + void insert_module_child_item (NodeId module, Resolver::CanonicalPath item); + Optional<std::vector<Resolver::CanonicalPath> &> + lookup_module_chidren_items (NodeId module); + + void insert_child_item_to_parent_module_mapping (NodeId child_item, + NodeId parent_module); + Optional<NodeId> lookup_parent_module (NodeId child_item); + private: Mappings (); @@ -396,6 +404,8 @@ private: // Maps each module's node id to a list of its children std::map<NodeId, std::vector<NodeId>> module_child_map; + std::map<NodeId, std::vector<Resolver::CanonicalPath>> module_child_items; + std::map<NodeId, NodeId> child_to_parent_module_map; }; } // namespace Analysis |