diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-04-22 13:04:24 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-04-22 15:36:44 +0200 |
commit | 159ffebb20c4da2ec07506d57d0243c4e5e7b43f (patch) | |
tree | ed9ae876dec5307da72be2a0327c95b32e86f23e | |
parent | 4337aea3be387921ee60520d2188906d8762367b (diff) | |
download | gcc-159ffebb20c4da2ec07506d57d0243c4e5e7b43f.zip gcc-159ffebb20c4da2ec07506d57d0243c4e5e7b43f.tar.gz gcc-159ffebb20c4da2ec07506d57d0243c4e5e7b43f.tar.bz2 |
privacy: visibility: Add remaining visitors for simple items
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 1 | ||||
-rw-r--r-- | gcc/rust/privacy/rust-visibility-resolver.cc | 57 | ||||
-rw-r--r-- | gcc/rust/privacy/rust-visibility-resolver.h | 8 |
3 files changed, 59 insertions, 7 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index 2e28207..b3dc025 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -633,6 +633,7 @@ public: virtual void accept_vis (HIRVisItemVisitor &vis) = 0; Visibility &get_visibility () { return visibility; } + const Visibility &get_visibility () const { return visibility; } std::string as_string () const override; }; diff --git a/gcc/rust/privacy/rust-visibility-resolver.cc b/gcc/rust/privacy/rust-visibility-resolver.cc index 0b7a529..8f5aeba 100644 --- a/gcc/rust/privacy/rust-visibility-resolver.cc +++ b/gcc/rust/privacy/rust-visibility-resolver.cc @@ -64,6 +64,16 @@ VisibilityResolver::resolve_visibility (const HIR::Visibility &visibility, } } +void +VisibilityResolver::resolve_and_update (const HIR::VisItem *item) +{ + ModuleVisibility module_vis; + if (!resolve_visibility (item->get_visibility (), module_vis)) + return; // we will already have emitted errors + + mappings.insert_visibility (item->get_mappings ().get_defid (), module_vis); +} + DefId VisibilityResolver::peek_module () { @@ -101,19 +111,27 @@ VisibilityResolver::visit (HIR::UseDeclaration &use_decl) void VisibilityResolver::visit (HIR::Function &func) -{} +{ + resolve_and_update (&func); +} void VisibilityResolver::visit (HIR::TypeAlias &type_alias) -{} +{ + resolve_and_update (&type_alias); +} void VisibilityResolver::visit (HIR::StructStruct &struct_item) -{} +{ + resolve_and_update (&struct_item); +} void VisibilityResolver::visit (HIR::TupleStruct &tuple_struct) -{} +{ + resolve_and_update (&tuple_struct); +} void VisibilityResolver::visit (HIR::Enum &enum_item) @@ -133,11 +151,15 @@ VisibilityResolver::visit (HIR::Union &union_item) void VisibilityResolver::visit (HIR::ConstantItem &const_item) -{} +{ + resolve_and_update (&const_item); +} void VisibilityResolver::visit (HIR::StaticItem &static_item) -{} +{ + resolve_and_update (&static_item); +} void VisibilityResolver::visit (HIR::Trait &trait) @@ -153,7 +175,28 @@ VisibilityResolver::visit (HIR::Trait &trait) void VisibilityResolver::visit (HIR::ImplBlock &impl) -{} +{ + for (auto &item : impl.get_impl_items ()) + { + HIR::VisItem *vis_item; + switch (item->get_impl_item_type ()) + { + case HIR::ImplItem::FUNCTION: + vis_item = static_cast<HIR::Function *> (item.get ()); + break; + case HIR::ImplItem::TYPE_ALIAS: + vis_item = static_cast<HIR::TypeAlias *> (item.get ()); + break; + case HIR::ImplItem::CONSTANT: + vis_item = static_cast<HIR::ConstantItem *> (item.get ()); + break; + default: + gcc_unreachable (); + return; + } + vis_item->accept_vis (*this); + } +} void VisibilityResolver::visit (HIR::ExternBlock &block) diff --git a/gcc/rust/privacy/rust-visibility-resolver.h b/gcc/rust/privacy/rust-visibility-resolver.h index 394c3d4..16fb42f 100644 --- a/gcc/rust/privacy/rust-visibility-resolver.h +++ b/gcc/rust/privacy/rust-visibility-resolver.h @@ -53,6 +53,14 @@ public: ModuleVisibility &to_resolve); /** + * Resolve the visibility of an item and updates it. This is useful for + * vis-items who need to be resolved but do not care about their module + * visibility - const items, static items, etc. For items with an impact on + * their children (enums, traits), this cannot be used + */ + void resolve_and_update (const HIR::VisItem *item); + + /** * Get the DefId of the parent module we are currently visiting. * * @return UNKNOWN_DEFID if the module stack is empty, a valid `DefId` |