diff options
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.h | 19 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-type.h | 3 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower.cc | 6 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 50 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.h | 27 |
5 files changed, 100 insertions, 5 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h index d49d2b2..3083554 100644 --- a/gcc/rust/hir/rust-ast-lower-item.h +++ b/gcc/rust/hir/rust-ast-lower-item.h @@ -496,10 +496,12 @@ public: std::vector<std::unique_ptr<HIR::TypeParamBound> > type_param_bounds; std::vector<std::unique_ptr<HIR::TraitItem> > trait_items; + std::vector<HirId> trait_item_ids; for (auto &item : trait.get_trait_items ()) { HIR::TraitItem *lowered = ASTLowerTraitItem::translate (item.get ()); trait_items.push_back (std::unique_ptr<HIR::TraitItem> (lowered)); + trait_item_ids.push_back (lowered->get_mappings ().get_hirid ()); } auto crate_num = mappings->get_current_crate (); @@ -507,17 +509,24 @@ public: mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - translated = new HIR::Trait (mapping, trait.get_identifier (), - trait.is_unsafe (), std::move (generic_params), - std::move (type_param_bounds), where_clause, - std::move (trait_items), vis, - trait.get_outer_attrs (), trait.get_locus ()); + HIR::Trait *hir_trait + = new HIR::Trait (mapping, trait.get_identifier (), trait.is_unsafe (), + std::move (generic_params), + std::move (type_param_bounds), where_clause, + std::move (trait_items), vis, trait.get_outer_attrs (), + trait.get_locus ()); + translated = hir_trait; mappings->insert_defid_mapping (mapping.get_defid (), translated); mappings->insert_hir_item (mapping.get_crate_num (), mapping.get_hirid (), translated); mappings->insert_location (crate_num, mapping.get_hirid (), trait.get_locus ()); + + for (auto trait_item_id : trait_item_ids) + { + mappings->insert_trait_item_mapping (trait_item_id, hir_trait); + } } void visit (AST::TraitImpl &impl_block) override diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h index 8db8637..9b5ec0a 100644 --- a/gcc/rust/hir/rust-ast-lower-type.h +++ b/gcc/rust/hir/rust-ast-lower-type.h @@ -284,6 +284,9 @@ public: resolver.translated->get_mappings ().get_crate_num (), resolver.translated->get_mappings ().get_hirid (), param->get_locus_slow ()); + resolver.mappings->insert_hir_generic_param ( + resolver.translated->get_mappings ().get_crate_num (), + resolver.translated->get_mappings ().get_hirid (), resolver.translated); return resolver.translated; } diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc index 23914f8..ed59777 100644 --- a/gcc/rust/hir/rust-ast-lower.cc +++ b/gcc/rust/hir/rust-ast-lower.cc @@ -263,6 +263,12 @@ ASTLowerPathInExpression::visit (AST::PathInExpression &expr) std::vector<HIR::PathExprSegment> path_segments; expr.iterate_path_segments ([&] (AST::PathExprSegment &s) mutable -> bool { path_segments.push_back (lower_path_expr_seg (s)); + + // insert the mappings for the segment + HIR::PathExprSegment *lowered_seg = &path_segments.back (); + mappings->insert_hir_path_expr_seg ( + lowered_seg->get_mappings ().get_crate_num (), + lowered_seg->get_mappings ().get_hirid (), lowered_seg); return true; }); diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 69fbe25..4ffbff0 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -383,6 +383,56 @@ Mappings::lookup_hir_expr (CrateNum crateNum, HirId id) } void +Mappings::insert_hir_path_expr_seg (CrateNum crateNum, HirId id, + HIR::PathExprSegment *expr) +{ + rust_assert (lookup_hir_path_expr_seg (crateNum, id) == nullptr); + + hirPathSegMappings[crateNum][id] = expr; + nodeIdToHirMappings[crateNum][expr->get_mappings ().get_nodeid ()] = id; + insert_location (crateNum, id, expr->get_locus ()); +} + +HIR::PathExprSegment * +Mappings::lookup_hir_path_expr_seg (CrateNum crateNum, HirId id) +{ + auto it = hirPathSegMappings.find (crateNum); + if (it == hirPathSegMappings.end ()) + return nullptr; + + auto iy = it->second.find (id); + if (iy == it->second.end ()) + return nullptr; + + return iy->second; +} + +void +Mappings::insert_hir_generic_param (CrateNum crateNum, HirId id, + HIR::GenericParam *param) +{ + rust_assert (lookup_hir_generic_param (crateNum, id) == nullptr); + + hirGenericParamMappings[crateNum][id] = param; + nodeIdToHirMappings[crateNum][param->get_mappings ().get_nodeid ()] = id; + insert_location (crateNum, id, param->get_locus_slow ()); +} + +HIR::GenericParam * +Mappings::lookup_hir_generic_param (CrateNum crateNum, HirId id) +{ + auto it = hirGenericParamMappings.find (crateNum); + if (it == hirGenericParamMappings.end ()) + return nullptr; + + auto iy = it->second.find (id); + if (iy == it->second.end ()) + return nullptr; + + return iy->second; +} + +void Mappings::insert_hir_type (CrateNum crateNum, HirId id, HIR::Type *type) { rust_assert (lookup_hir_type (crateNum, id) == nullptr); diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 7e5449c..ccc873b 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -148,6 +148,14 @@ public: void insert_hir_expr (CrateNum crateNum, HirId id, HIR::Expr *expr); HIR::Expr *lookup_hir_expr (CrateNum crateNum, HirId id); + void insert_hir_path_expr_seg (CrateNum crateNum, HirId id, + HIR::PathExprSegment *expr); + HIR::PathExprSegment *lookup_hir_path_expr_seg (CrateNum crateNum, HirId id); + + void insert_hir_generic_param (CrateNum crateNum, HirId id, + HIR::GenericParam *expr); + HIR::GenericParam *lookup_hir_generic_param (CrateNum crateNum, HirId id); + void insert_hir_type (CrateNum crateNum, HirId id, HIR::Type *type); HIR::Type *lookup_hir_type (CrateNum crateNum, HirId id); @@ -215,6 +223,20 @@ public: != nullptr; } + void insert_trait_item_mapping (HirId trait_item_id, HIR::Trait *trait) + { + rust_assert (hirTraitItemsToTraitMappings.find (trait_item_id) + == hirTraitItemsToTraitMappings.end ()); + hirTraitItemsToTraitMappings[trait_item_id] = trait; + } + + HIR::Trait *lookup_trait_item_mapping (HirId trait_item_id) + { + auto lookup = hirTraitItemsToTraitMappings.find (trait_item_id); + rust_assert (lookup != hirTraitItemsToTraitMappings.end ()); + return lookup->second; + } + private: Mappings (); @@ -245,6 +267,11 @@ private: std::map<CrateNum, std::map<HirId, HIR::TraitItem *> > hirTraitItemMappings; std::map<CrateNum, std::map<HirId, HIR::ExternalItem *> > hirExternItemMappings; + std::map<CrateNum, std::map<HirId, HIR::PathExprSegment *> > + hirPathSegMappings; + std::map<CrateNum, std::map<HirId, HIR::GenericParam *> > + hirGenericParamMappings; + std::map<HirId, HIR::Trait *> hirTraitItemsToTraitMappings; // location info std::map<CrateNum, std::map<NodeId, Location> > locations; |