aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.h1
-rw-r--r--gcc/rust/privacy/rust-visibility-resolver.cc57
-rw-r--r--gcc/rust/privacy/rust-visibility-resolver.h8
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`