diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-full-test.cc | 4 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 15 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir.h | 10 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 19 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.h | 3 |
5 files changed, 49 insertions, 2 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-full-test.cc b/gcc/rust/hir/tree/rust-hir-full-test.cc index adc8eea..4391f39 100644 --- a/gcc/rust/hir/tree/rust-hir-full-test.cc +++ b/gcc/rust/hir/tree/rust-hir-full-test.cc @@ -3453,7 +3453,7 @@ TraitFunctionDecl::as_string () const str += "\n Function params: "; if (is_method ()) { - str += self.as_string (); + str += self.as_string () + (has_params () ? ", " : ""); } if (has_params ()) @@ -3463,7 +3463,7 @@ TraitFunctionDecl::as_string () const str += "\n " + param.as_string (); } } - else + else if (!is_method ()) { str += "none"; } diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index 09f9d38..3afea36 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -2346,6 +2346,11 @@ public: return decl.get_function_name (); } + TraitItemKind get_item_kind () const override final + { + return TraitItemKind::FUNC; + } + protected: // Clone function implementation as (not pure) virtual method TraitItemFunc *clone_trait_item_impl () const override @@ -2420,6 +2425,11 @@ public: const std::string trait_identifier () const override final { return name; } + TraitItemKind get_item_kind () const override final + { + return TraitItemKind::CONST; + } + protected: // Clone function implementation as (not pure) virtual method TraitItemConst *clone_trait_item_impl () const override @@ -2495,6 +2505,11 @@ public: const std::string trait_identifier () const override final { return name; } + TraitItemKind get_item_kind () const override final + { + return TraitItemKind::TYPE; + } + protected: // Clone function implementation as (not pure) virtual method TraitItemType *clone_trait_item_impl () const override diff --git a/gcc/rust/hir/tree/rust-hir.h b/gcc/rust/hir/tree/rust-hir.h index de312ee..76d451c 100644 --- a/gcc/rust/hir/tree/rust-hir.h +++ b/gcc/rust/hir/tree/rust-hir.h @@ -677,6 +677,14 @@ protected: // Item used in trait declarations - abstract base class class TraitItem { +public: + enum TraitItemKind + { + FUNC, + CONST, + TYPE + }; + protected: // Constructor TraitItem (Analysis::NodeMapping mappings) : mappings (mappings) {} @@ -701,6 +709,8 @@ public: virtual const std::string trait_identifier () const = 0; const Analysis::NodeMapping get_mappings () const { return mappings; } + + virtual TraitItemKind get_item_kind () const = 0; }; class ImplItem diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 4b71312..786fc5a 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -719,5 +719,24 @@ Mappings::iterate_impl_blocks (std::function<bool (HirId, HIR::ImplBlock *)> cb) } } +void +Mappings::iterate_trait_items ( + std::function<bool (HIR::TraitItem *, HIR::Trait *)> cb) +{ + for (auto it = hirTraitItemMappings.begin (); + it != hirTraitItemMappings.end (); it++) + { + for (auto iy = it->second.begin (); iy != it->second.end (); iy++) + { + HirId trait_item_id = iy->first; + HIR::TraitItem *trait_item = iy->second; + HIR::Trait *trait = lookup_trait_item_mapping (trait_item_id); + + if (!cb (trait_item, trait)) + return; + } + } +} + } // namespace Analysis } // namespace Rust diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 3ed3d47..ec08170 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -474,6 +474,9 @@ public: void iterate_impl_blocks (std::function<bool (HirId, HIR::ImplBlock *)> cb); + void iterate_trait_items ( + std::function<bool (HIR::TraitItem *item, HIR::Trait *)> cb); + bool is_impl_item (HirId id) { HirId parent_impl_block_id = UNKNOWN_HIRID; |