Struct rustc_privacy::EmbargoVisitor [−][src]
pub(crate) struct EmbargoVisitor<'tcx> {
tcx: TyCtxt<'tcx>,
access_levels: AccessLevels,
macro_reachable: FxHashSet<(HirId, DefId)>,
prev_level: Option<AccessLevel>,
changed: bool,
}Expand description
The embargo visitor, used to determine the exports of the AST.
Fields
tcx: TyCtxt<'tcx>access_levels: AccessLevelsExpand description
Accessibility levels for reachable nodes.
macro_reachable: FxHashSet<(HirId, DefId)>Expand description
A set of pairs corresponding to modules, where the first module is reachable via a macro that’s defined in the second module. This cannot be represented as reachable because it can’t handle the following case:
pub mod n { // Should be Public
pub(crate) mod p { // Should not be accessible
pub fn f() -> i32 { 12 } // Must be Reachable
}
}
pub macro m() {
n::p::f()
}
prev_level: Option<AccessLevel>Expand description
Previous accessibility level; None means unreachable.
changed: boolExpand description
Has something changed in the level map?
Implementations
impl<'tcx> EmbargoVisitor<'tcx>[src]
impl<'tcx> EmbargoVisitor<'tcx>[src]pub(crate) fn get(&self, id: HirId) -> Option<AccessLevel>[src]
pub(crate) fn update(
&mut self,
id: HirId,
level: Option<AccessLevel>
) -> Option<AccessLevel>[src]
pub(crate) fn update(
&mut self,
id: HirId,
level: Option<AccessLevel>
) -> Option<AccessLevel>[src]Updates node level and returns the updated level.
pub(crate) fn reach(
&mut self,
item_id: HirId,
access_level: Option<AccessLevel>
) -> ReachEverythingInTheInterfaceVisitor<'_, 'tcx>[src]
&mut self,
item_id: HirId,
access_level: Option<AccessLevel>
) -> ReachEverythingInTheInterfaceVisitor<'_, 'tcx>
pub(crate) fn update_macro_reachable(
&mut self,
reachable_mod: HirId,
defining_mod: DefId
) -> bool[src]
pub(crate) fn update_macro_reachable(
&mut self,
reachable_mod: HirId,
defining_mod: DefId
) -> bool[src]Updates the item as being reachable through a macro defined in the given
module. Returns true if the level has changed.
pub(crate) fn update_macro_reachable_mod(
&mut self,
reachable_mod: HirId,
defining_mod: DefId
)[src]
&mut self,
reachable_mod: HirId,
defining_mod: DefId
)
pub(crate) fn update_macro_reachable_def(
&mut self,
hir_id: HirId,
def_kind: DefKind,
vis: Visibility,
module: DefId
)[src]
&mut self,
hir_id: HirId,
def_kind: DefKind,
vis: Visibility,
module: DefId
)
pub(crate) fn update_visibility_of_intermediate_use_statements(
&mut self,
segments: &[PathSegment<'_>]
)[src]
pub(crate) fn update_visibility_of_intermediate_use_statements(
&mut self,
segments: &[PathSegment<'_>]
)[src]Given the path segments of a ItemKind::Use, then we need
to update the visibility of the intermediate use so that it isn’t linted
by unreachable_pub.
This isn’t trivial as path.res has the DefId of the eventual target
of the use statement not of the next intermediate use statement.
To do this, consider the last two segments of the path to our intermediate use statement. We expect the penultimate segment to be a module and the last segment to be the name of the item we are exporting. We can then look at the items contained in the module for the use statement with that name and update that item’s visibility.
FIXME: This solution won’t work with glob imports and doesn’t respect namespaces. See https://github.com/rust-lang/rust/pull/57922#discussion_r251234202.
Trait Implementations
impl<'tcx> Visitor<'tcx> for EmbargoVisitor<'tcx>[src]
impl<'tcx> Visitor<'tcx> for EmbargoVisitor<'tcx>[src]fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map>[src]
fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map>[src]We want to visit items in the context of their containing module and so forth, so supply a crate for doing a deep walk.
type Map = Map<'tcx>
fn visit_item(&mut self, item: &'tcx Item<'tcx>)[src]
fn visit_item(&mut self, item: &'tcx Item<'tcx>)[src]Visits the top-level item and (optionally) nested items / impl items. See
visit_nested_item for details. Read more
fn visit_block(&mut self, b: &'tcx Block<'tcx>)[src]
fn visit_mod(&mut self, m: &'tcx Mod<'tcx>, _sp: Span, id: HirId)[src]
fn visit_macro_def(&mut self, md: &'tcx MacroDef<'tcx>)[src]
fn visit_nested_item(&mut self, id: ItemId)[src]
fn visit_nested_item(&mut self, id: ItemId)[src]Invoked when a nested item is encountered. By default does
nothing unless you override nested_visit_map to return other than
None, in which case it will walk the item. You probably
don’t want to override this method – instead, override
nested_visit_map or use the “shallow” or “deep” visit
patterns described on itemlikevisit::ItemLikeVisitor. The only
reason to override this method is if you want a nested pattern
but cannot supply a Map; see nested_visit_map for advice. Read more
fn visit_nested_trait_item(&mut self, id: TraitItemId)[src]
fn visit_nested_trait_item(&mut self, id: TraitItemId)[src]Like visit_nested_item(), but for trait items. See
visit_nested_item() for advice on when to override this
method. Read more
fn visit_nested_impl_item(&mut self, id: ImplItemId)[src]
fn visit_nested_impl_item(&mut self, id: ImplItemId)[src]Like visit_nested_item(), but for impl items. See
visit_nested_item() for advice on when to override this
method. Read more
fn visit_nested_foreign_item(&mut self, id: ForeignItemId)[src]
fn visit_nested_foreign_item(&mut self, id: ForeignItemId)[src]Like visit_nested_item(), but for foreign items. See
visit_nested_item() for advice on when to override this
method. Read more
fn visit_nested_body(&mut self, id: BodyId)[src]
fn visit_nested_body(&mut self, id: BodyId)[src]Invoked to visit the body of a function, method or closure. Like
visit_nested_item, does nothing by default unless you override
nested_visit_map to return other than None, in which case it will walk
the body. Read more
fn visit_param(&mut self, param: &'v Param<'v>)[src]
fn visit_body(&mut self, b: &'v Body<'v>)[src]
fn as_deep_visitor(&mut self) -> DeepVisitor<'_, Self>[src]
fn as_deep_visitor(&mut self) -> DeepVisitor<'_, Self>[src]When invoking visit_all_item_likes(), you need to supply an
item-like visitor. This method converts a “intra-visit”
visitor into an item-like visitor that walks the entire tree.
If you use this, you probably don’t want to process the
contents of nested item-like things, since the outer loop will
visit them as well. Read more
fn visit_id(&mut self, _hir_id: HirId)[src]
fn visit_name(&mut self, _span: Span, _name: Symbol)[src]
fn visit_ident(&mut self, ident: Ident)[src]
fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>)[src]
fn visit_local(&mut self, l: &'v Local<'v>)[src]
fn visit_stmt(&mut self, s: &'v Stmt<'v>)[src]
fn visit_arm(&mut self, a: &'v Arm<'v>)[src]
fn visit_pat(&mut self, p: &'v Pat<'v>)[src]
fn visit_anon_const(&mut self, c: &'v AnonConst)[src]
fn visit_expr(&mut self, ex: &'v Expr<'v>)[src]
fn visit_ty(&mut self, t: &'v Ty<'v>)[src]
fn visit_generic_param(&mut self, p: &'v GenericParam<'v>)[src]
fn visit_const_param_default(&mut self, _param: HirId, ct: &'v AnonConst)[src]
fn visit_generics(&mut self, g: &'v Generics<'v>)[src]
fn visit_where_predicate(&mut self, predicate: &'v WherePredicate<'v>)[src]
fn visit_fn_decl(&mut self, fd: &'v FnDecl<'v>)[src]
fn visit_fn(
&mut self,
fk: FnKind<'v>,
fd: &'v FnDecl<'v>,
b: BodyId,
s: Span,
id: HirId
)[src]
&mut self,
fk: FnKind<'v>,
fd: &'v FnDecl<'v>,
b: BodyId,
s: Span,
id: HirId
)
fn visit_use(&mut self, path: &'v Path<'v>, hir_id: HirId)[src]
fn visit_trait_item(&mut self, ti: &'v TraitItem<'v>)[src]
fn visit_trait_item_ref(&mut self, ii: &'v TraitItemRef)[src]
fn visit_impl_item(&mut self, ii: &'v ImplItem<'v>)[src]
fn visit_foreign_item_ref(&mut self, ii: &'v ForeignItemRef<'v>)[src]
fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef<'v>)[src]
fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>)[src]
fn visit_param_bound(&mut self, bounds: &'v GenericBound<'v>)[src]
fn visit_poly_trait_ref(
&mut self,
t: &'v PolyTraitRef<'v>,
m: TraitBoundModifier
)[src]
&mut self,
t: &'v PolyTraitRef<'v>,
m: TraitBoundModifier
)
fn visit_variant_data(
&mut self,
s: &'v VariantData<'v>,
Symbol,
&'v Generics<'v>,
_parent_id: HirId,
Span
)[src]
&mut self,
s: &'v VariantData<'v>,
Symbol,
&'v Generics<'v>,
_parent_id: HirId,
Span
)
fn visit_field_def(&mut self, s: &'v FieldDef<'v>)[src]
fn visit_enum_def(
&mut self,
enum_definition: &'v EnumDef<'v>,
generics: &'v Generics<'v>,
item_id: HirId,
Span
)[src]
&mut self,
enum_definition: &'v EnumDef<'v>,
generics: &'v Generics<'v>,
item_id: HirId,
Span
)
fn visit_variant(
&mut self,
v: &'v Variant<'v>,
g: &'v Generics<'v>,
item_id: HirId
)[src]
&mut self,
v: &'v Variant<'v>,
g: &'v Generics<'v>,
item_id: HirId
)
fn visit_label(&mut self, label: &'v Label)[src]
fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg<'v>)[src]
fn visit_lifetime(&mut self, lifetime: &'v Lifetime)[src]
fn visit_qpath(&mut self, qpath: &'v QPath<'v>, id: HirId, span: Span)[src]
fn visit_path(&mut self, path: &'v Path<'v>, _id: HirId)[src]
fn visit_path_segment(
&mut self,
path_span: Span,
path_segment: &'v PathSegment<'v>
)[src]
&mut self,
path_span: Span,
path_segment: &'v PathSegment<'v>
)
fn visit_generic_args(
&mut self,
path_span: Span,
generic_args: &'v GenericArgs<'v>
)[src]
&mut self,
path_span: Span,
generic_args: &'v GenericArgs<'v>
)