Skip to content

Commit 1286acc

Browse files
Merge #1157
1157: Resolve remaining simple visibilites r=CohenArthur a=CohenArthur Based on #1155, so you can review just the last commit. This adds the remaining simple visitors for visibility resolving, as well as a helper method for doing so. Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
2 parents a936265 + 159ffeb commit 1286acc

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

gcc/rust/hir/tree/rust-hir-item.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,7 @@ class VisItem : public Item
633633
virtual void accept_vis (HIRVisItemVisitor &vis) = 0;
634634

635635
Visibility &get_visibility () { return visibility; }
636+
const Visibility &get_visibility () const { return visibility; }
636637

637638
std::string as_string () const override;
638639
};

gcc/rust/privacy/rust-visibility-resolver.cc

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ VisibilityResolver::resolve_visibility (const HIR::Visibility &visibility,
6464
}
6565
}
6666

67+
void
68+
VisibilityResolver::resolve_and_update (const HIR::VisItem *item)
69+
{
70+
ModuleVisibility module_vis;
71+
if (!resolve_visibility (item->get_visibility (), module_vis))
72+
return; // we will already have emitted errors
73+
74+
mappings.insert_visibility (item->get_mappings ().get_defid (), module_vis);
75+
}
76+
6777
DefId
6878
VisibilityResolver::peek_module ()
6979
{
@@ -101,19 +111,27 @@ VisibilityResolver::visit (HIR::UseDeclaration &use_decl)
101111

102112
void
103113
VisibilityResolver::visit (HIR::Function &func)
104-
{}
114+
{
115+
resolve_and_update (&func);
116+
}
105117

106118
void
107119
VisibilityResolver::visit (HIR::TypeAlias &type_alias)
108-
{}
120+
{
121+
resolve_and_update (&type_alias);
122+
}
109123

110124
void
111125
VisibilityResolver::visit (HIR::StructStruct &struct_item)
112-
{}
126+
{
127+
resolve_and_update (&struct_item);
128+
}
113129

114130
void
115131
VisibilityResolver::visit (HIR::TupleStruct &tuple_struct)
116-
{}
132+
{
133+
resolve_and_update (&tuple_struct);
134+
}
117135

118136
void
119137
VisibilityResolver::visit (HIR::Enum &enum_item)
@@ -133,11 +151,15 @@ VisibilityResolver::visit (HIR::Union &union_item)
133151

134152
void
135153
VisibilityResolver::visit (HIR::ConstantItem &const_item)
136-
{}
154+
{
155+
resolve_and_update (&const_item);
156+
}
137157

138158
void
139159
VisibilityResolver::visit (HIR::StaticItem &static_item)
140-
{}
160+
{
161+
resolve_and_update (&static_item);
162+
}
141163

142164
void
143165
VisibilityResolver::visit (HIR::Trait &trait)
@@ -153,7 +175,28 @@ VisibilityResolver::visit (HIR::Trait &trait)
153175

154176
void
155177
VisibilityResolver::visit (HIR::ImplBlock &impl)
156-
{}
178+
{
179+
for (auto &item : impl.get_impl_items ())
180+
{
181+
HIR::VisItem *vis_item;
182+
switch (item->get_impl_item_type ())
183+
{
184+
case HIR::ImplItem::FUNCTION:
185+
vis_item = static_cast<HIR::Function *> (item.get ());
186+
break;
187+
case HIR::ImplItem::TYPE_ALIAS:
188+
vis_item = static_cast<HIR::TypeAlias *> (item.get ());
189+
break;
190+
case HIR::ImplItem::CONSTANT:
191+
vis_item = static_cast<HIR::ConstantItem *> (item.get ());
192+
break;
193+
default:
194+
gcc_unreachable ();
195+
return;
196+
}
197+
vis_item->accept_vis (*this);
198+
}
199+
}
157200

158201
void
159202
VisibilityResolver::visit (HIR::ExternBlock &block)

gcc/rust/privacy/rust-visibility-resolver.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ class VisibilityResolver : public HIR::HIRVisItemVisitor
5252
bool resolve_visibility (const HIR::Visibility &visibility,
5353
ModuleVisibility &to_resolve);
5454

55+
/**
56+
* Resolve the visibility of an item and updates it. This is useful for
57+
* vis-items who need to be resolved but do not care about their module
58+
* visibility - const items, static items, etc. For items with an impact on
59+
* their children (enums, traits), this cannot be used
60+
*/
61+
void resolve_and_update (const HIR::VisItem *item);
62+
5563
/**
5664
* Get the DefId of the parent module we are currently visiting.
5765
*

0 commit comments

Comments
 (0)