From 1c5fef82c0f525be3386557180a416d681743c4f Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Fri, 16 Jul 2021 16:50:19 +0100 Subject: Add iterate impl_blocks helper --- gcc/rust/util/rust-hir-map.cc | 16 ++++++++++++++++ gcc/rust/util/rust-hir-map.h | 2 ++ 2 files changed, 18 insertions(+) (limited to 'gcc') diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 33ba8d0..73b964f 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -567,5 +567,21 @@ Mappings::iterate_impl_items ( } } +void +Mappings::iterate_impl_blocks (std::function cb) +{ + for (auto it = hirImplBlockMappings.begin (); + it != hirImplBlockMappings.end (); it++) + { + for (auto iy = it->second.begin (); iy != it->second.end (); iy++) + { + HirId id = iy->first; + HIR::ImplBlock *impl_block = iy->second; + if (!cb (id, impl_block)) + return; + } + } +} + } // namespace Analysis } // namespace Rust diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 98c15a2..f000756 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -198,6 +198,8 @@ public: void iterate_impl_items ( std::function cb); + void iterate_impl_blocks (std::function cb); + bool is_impl_item (HirId id) { HirId parent_impl_block_id = UNKNOWN_HIRID; -- cgit v1.1 From 1dc68e40f2d2b9b0d2a208a63f4923be8b12351e Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Thu, 22 Jul 2021 12:18:59 +0100 Subject: Add mappings for trait items --- gcc/rust/hir/rust-ast-lower-implitem.h | 37 ++++++++++++++++++++++++++-------- gcc/rust/util/rust-hir-map.cc | 24 ++++++++++++++++++++++ gcc/rust/util/rust-hir-map.h | 5 +++++ 3 files changed, 58 insertions(+), 8 deletions(-) (limited to 'gcc') diff --git a/gcc/rust/hir/rust-ast-lower-implitem.h b/gcc/rust/hir/rust-ast-lower-implitem.h index 6e4c0b1..cbc80d3 100644 --- a/gcc/rust/hir/rust-ast-lower-implitem.h +++ b/gcc/rust/hir/rust-ast-lower-implitem.h @@ -364,10 +364,15 @@ public: mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - translated + HIR::TraitItemFunc *trait_item = new HIR::TraitItemFunc (mapping, std::move (decl), std::unique_ptr (block_expr), func.get_outer_attrs (), func.get_locus ()); + translated = trait_item; + mappings->insert_hir_trait_item (mapping.get_crate_num (), + mapping.get_hirid (), translated); + mappings->insert_location (crate_num, mapping.get_hirid (), + trait_item->get_locus ()); } void visit (AST::TraitItemMethod &method) override @@ -428,10 +433,15 @@ public: mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - translated + HIR::TraitItemFunc *trait_item = new HIR::TraitItemFunc (mapping, std::move (decl), std::unique_ptr (block_expr), method.get_outer_attrs (), method.get_locus ()); + translated = trait_item; + mappings->insert_hir_trait_item (mapping.get_crate_num (), + mapping.get_hirid (), translated); + mappings->insert_location (crate_num, mapping.get_hirid (), + trait_item->get_locus ()); } void visit (AST::TraitItemConst &constant) override @@ -447,11 +457,17 @@ public: mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - translated = new HIR::TraitItemConst (mapping, constant.get_identifier (), - std::unique_ptr (type), - std::unique_ptr (expr), - constant.get_outer_attrs (), - constant.get_locus ()); + HIR::TraitItemConst *trait_item + = new HIR::TraitItemConst (mapping, constant.get_identifier (), + std::unique_ptr (type), + std::unique_ptr (expr), + constant.get_outer_attrs (), + constant.get_locus ()); + translated = trait_item; + mappings->insert_hir_trait_item (mapping.get_crate_num (), + mapping.get_hirid (), translated); + mappings->insert_location (crate_num, mapping.get_hirid (), + trait_item->get_locus ()); } void visit (AST::TraitItemType &type) override @@ -463,10 +479,15 @@ public: mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - translated + HIR::TraitItemType *trait_item = new HIR::TraitItemType (mapping, type.get_identifier (), std::move (type_param_bounds), type.get_outer_attrs (), type.get_locus ()); + translated = trait_item; + mappings->insert_hir_trait_item (mapping.get_crate_num (), + mapping.get_hirid (), translated); + mappings->insert_location (crate_num, mapping.get_hirid (), + trait_item->get_locus ()); } private: diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 33ba8d0..04fd7e5 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -260,6 +260,30 @@ Mappings::lookup_hir_item (CrateNum crateNum, HirId id) } void +Mappings::insert_hir_trait_item (CrateNum crateNum, HirId id, + HIR::TraitItem *item) +{ + rust_assert (lookup_hir_item (crateNum, id) == nullptr); + + hirTraitItemMappings[crateNum][id] = item; + nodeIdToHirMappings[crateNum][item->get_mappings ().get_nodeid ()] = id; +} + +HIR::TraitItem * +Mappings::lookup_hir_trait_item (CrateNum crateNum, HirId id) +{ + auto it = hirTraitItemMappings.find (crateNum); + if (it == hirTraitItemMappings.end ()) + return nullptr; + + auto iy = it->second.find (id); + if (iy == it->second.end ()) + return nullptr; + + return iy->second; +} + +void Mappings::insert_hir_impl_block (CrateNum crateNum, HirId id, HIR::ImplBlock *item) { diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 98c15a2..0d14569 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -128,6 +128,10 @@ public: void insert_hir_item (CrateNum crateNum, HirId id, HIR::Item *item); HIR::Item *lookup_hir_item (CrateNum crateNum, HirId id); + void insert_hir_trait_item (CrateNum crateNum, HirId id, + HIR::TraitItem *item); + HIR::TraitItem *lookup_hir_trait_item (CrateNum crateNum, HirId id); + void insert_hir_impl_block (CrateNum crateNum, HirId id, HIR::ImplBlock *item); HIR::ImplBlock *lookup_hir_impl_block (CrateNum crateNum, HirId id); @@ -232,6 +236,7 @@ private: std::map > hirSelfParamMappings; std::map hirImplItemsToImplMappings; std::map > hirImplBlockMappings; + std::map > hirTraitItemMappings; // location info std::map > locations; -- cgit v1.1