Trait rustc_hir::intravisit::Visitor [−][src]
pub trait Visitor<'v>: Sized {
type Map: Map<'v>;
Show 55 methods
fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map>;
fn visit_nested_item(&mut self, id: ItemId) { ... }
fn visit_nested_trait_item(&mut self, id: TraitItemId) { ... }
fn visit_nested_impl_item(&mut self, id: ImplItemId) { ... }
fn visit_nested_foreign_item(&mut self, id: ForeignItemId) { ... }
fn visit_nested_body(&mut self, id: BodyId) { ... }
fn visit_param(&mut self, param: &'v Param<'v>) { ... }
fn visit_item(&mut self, i: &'v Item<'v>) { ... }
fn visit_body(&mut self, b: &'v Body<'v>) { ... }
fn as_deep_visitor(&mut self) -> DeepVisitor<'_, Self> { ... }
fn visit_id(&mut self, _hir_id: HirId) { ... }
fn visit_name(&mut self, _span: Span, _name: Symbol) { ... }
fn visit_ident(&mut self, ident: Ident) { ... }
fn visit_mod(&mut self, m: &'v Mod<'v>, _s: Span, n: HirId) { ... }
fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>) { ... }
fn visit_local(&mut self, l: &'v Local<'v>) { ... }
fn visit_block(&mut self, b: &'v Block<'v>) { ... }
fn visit_stmt(&mut self, s: &'v Stmt<'v>) { ... }
fn visit_arm(&mut self, a: &'v Arm<'v>) { ... }
fn visit_pat(&mut self, p: &'v Pat<'v>) { ... }
fn visit_anon_const(&mut self, c: &'v AnonConst) { ... }
fn visit_expr(&mut self, ex: &'v Expr<'v>) { ... }
fn visit_ty(&mut self, t: &'v Ty<'v>) { ... }
fn visit_generic_param(&mut self, p: &'v GenericParam<'v>) { ... }
fn visit_const_param_default(&mut self, _param: HirId, ct: &'v AnonConst) { ... }
fn visit_generics(&mut self, g: &'v Generics<'v>) { ... }
fn visit_where_predicate(&mut self, predicate: &'v WherePredicate<'v>) { ... }
fn visit_fn_decl(&mut self, fd: &'v FnDecl<'v>) { ... }
fn visit_fn(
&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) { ... }
fn visit_trait_item(&mut self, ti: &'v TraitItem<'v>) { ... }
fn visit_trait_item_ref(&mut self, ii: &'v TraitItemRef) { ... }
fn visit_impl_item(&mut self, ii: &'v ImplItem<'v>) { ... }
fn visit_foreign_item_ref(&mut self, ii: &'v ForeignItemRef) { ... }
fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef) { ... }
fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>) { ... }
fn visit_param_bound(&mut self, bounds: &'v GenericBound<'v>) { ... }
fn visit_poly_trait_ref(
&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
) { ... }
fn visit_field_def(&mut self, s: &'v FieldDef<'v>) { ... }
fn visit_enum_def(
&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
) { ... }
fn visit_label(&mut self, label: &'v Label) { ... }
fn visit_infer(&mut self, inf: &'v InferArg) { ... }
fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg<'v>) { ... }
fn visit_lifetime(&mut self, lifetime: &'v Lifetime) { ... }
fn visit_qpath(&mut self, qpath: &'v QPath<'v>, id: HirId, span: Span) { ... }
fn visit_path(&mut self, path: &'v Path<'v>, _id: HirId) { ... }
fn visit_path_segment(
&mut self,
path_span: Span,
path_segment: &'v PathSegment<'v>
) { ... }
fn visit_generic_args(
&mut self,
path_span: Span,
generic_args: &'v GenericArgs<'v>
) { ... }
fn visit_assoc_type_binding(&mut self, type_binding: &'v TypeBinding<'v>) { ... }
fn visit_attribute(&mut self, _id: HirId, _attr: &'v Attribute) { ... }
fn visit_vis(&mut self, vis: &'v Visibility<'v>) { ... }
fn visit_associated_item_kind(&mut self, kind: &'v AssocItemKind) { ... }
fn visit_defaultness(&mut self, defaultness: &'v Defaultness) { ... }
}
Expand description
Each method of the Visitor trait is a hook to be potentially
overridden. Each method’s default implementation recursively visits
the substructure of the input via the corresponding walk
method;
e.g., the visit_mod
method by default calls intravisit::walk_mod
.
Note that this visitor does NOT visit nested items by default
(this is why the module is called intravisit
, to distinguish it
from the AST’s visit
module, which acts differently). If you
simply want to visit all items in the crate in some order, you
should call Crate::visit_all_items
. Otherwise, see the comment
on visit_nested_item
for details on how to visit nested items.
If you want to ensure that your code handles every variant
explicitly, you need to override each method. (And you also need
to monitor future changes to Visitor
in case a new method with a
new default implementation gets introduced.)
Associated Types
Required methods
fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map>
fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map>
The default versions of the visit_nested_XXX
routines invoke
this method to get a map to use. By selecting an enum variant,
you control which kinds of nested HIR are visited; see
NestedVisitorMap
for details. By “nested HIR”, we are
referring to bits of HIR that are not directly embedded within
one another but rather indirectly, through a table in the
crate. This is done to control dependencies during incremental
compilation: the non-inline bits of HIR can be tracked and
hashed separately.
If for some reason you want the nested behavior, but don’t
have a Map
at your disposal: then you should override the
visit_nested_XXX
methods, and override this method to
panic!()
. This way, if a new visit_nested_XXX
variant is
added in the future, we will see the panic in your code and
fix it appropriately.
Provided methods
fn visit_nested_item(&mut self, id: ItemId)
fn visit_nested_item(&mut self, id: ItemId)
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.
fn visit_nested_trait_item(&mut self, id: TraitItemId)
fn visit_nested_trait_item(&mut self, id: TraitItemId)
Like visit_nested_item()
, but for trait items. See
visit_nested_item()
for advice on when to override this
method.
fn visit_nested_impl_item(&mut self, id: ImplItemId)
fn visit_nested_impl_item(&mut self, id: ImplItemId)
Like visit_nested_item()
, but for impl items. See
visit_nested_item()
for advice on when to override this
method.
fn visit_nested_foreign_item(&mut self, id: ForeignItemId)
fn visit_nested_foreign_item(&mut self, id: ForeignItemId)
Like visit_nested_item()
, but for foreign items. See
visit_nested_item()
for advice on when to override this
method.
fn visit_nested_body(&mut self, id: BodyId)
fn visit_nested_body(&mut self, id: BodyId)
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.
fn visit_param(&mut self, param: &'v Param<'v>)
fn visit_item(&mut self, i: &'v Item<'v>)
fn visit_item(&mut self, i: &'v Item<'v>)
Visits the top-level item and (optionally) nested items / impl items. See
visit_nested_item
for details.
fn visit_body(&mut self, b: &'v Body<'v>)
fn as_deep_visitor(&mut self) -> DeepVisitor<'_, Self>
fn as_deep_visitor(&mut self) -> DeepVisitor<'_, Self>
When invoking visit_all_item_likes()
, you need to supply an
item-like visitor. This method converts an “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.