public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] privacy: visibility: Add remaining visitors for simple items
@ 2022-06-08 12:36 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-06-08 12:36 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:159ffebb20c4da2ec07506d57d0243c4e5e7b43f

commit 159ffebb20c4da2ec07506d57d0243c4e5e7b43f
Author: Arthur Cohen <arthur.cohen@embecosm.com>
Date:   Fri Apr 22 13:04:24 2022 +0200

    privacy: visibility: Add remaining visitors for simple items

Diff:
---
 gcc/rust/hir/tree/rust-hir-item.h            |  1 +
 gcc/rust/privacy/rust-visibility-resolver.cc | 57 ++++++++++++++++++++++++----
 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 2e28207098d..b3dc025319f 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 0b7a52910cd..8f5aebadf44 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 394c3d4c414..16fb42fa0b4 100644
--- a/gcc/rust/privacy/rust-visibility-resolver.h
+++ b/gcc/rust/privacy/rust-visibility-resolver.h
@@ -52,6 +52,14 @@ public:
   bool resolve_visibility (const HIR::Visibility &visibility,
 			   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.
    *


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-06-08 12:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-08 12:36 [gcc/devel/rust/master] privacy: visibility: Add remaining visitors for simple items Thomas Schwinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).