pub trait Visitor<'v>: Sized {
type Map: Map<'v> = <Self::NestedFilter as NestedFilter<'v>>::Map;
type NestedFilter: NestedFilter<'v> = None;
type Result: VisitorResult = ();
Show 63 methods
// Provided methods
fn nested_visit_map(&mut self) -> Self::Map { ... }
fn visit_nested_item(&mut self, id: ItemId) -> Self::Result { ... }
fn visit_nested_trait_item(&mut self, id: TraitItemId) -> Self::Result { ... }
fn visit_nested_impl_item(&mut self, id: ImplItemId) -> Self::Result { ... }
fn visit_nested_foreign_item(&mut self, id: ForeignItemId) -> Self::Result { ... }
fn visit_nested_body(&mut self, id: BodyId) -> Self::Result { ... }
fn visit_param(&mut self, param: &'v Param<'v>) -> Self::Result { ... }
fn visit_item(&mut self, i: &'v Item<'v>) -> Self::Result { ... }
fn visit_body(&mut self, b: &Body<'v>) -> Self::Result { ... }
fn visit_id(&mut self, _hir_id: HirId) -> Self::Result { ... }
fn visit_name(&mut self, _name: Symbol) -> Self::Result { ... }
fn visit_ident(&mut self, ident: Ident) -> Self::Result { ... }
fn visit_mod(&mut self, m: &'v Mod<'v>, _s: Span, n: HirId) -> Self::Result { ... }
fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>) -> Self::Result { ... }
fn visit_local(&mut self, l: &'v LetStmt<'v>) -> Self::Result { ... }
fn visit_block(&mut self, b: &'v Block<'v>) -> Self::Result { ... }
fn visit_stmt(&mut self, s: &'v Stmt<'v>) -> Self::Result { ... }
fn visit_arm(&mut self, a: &'v Arm<'v>) -> Self::Result { ... }
fn visit_pat(&mut self, p: &'v Pat<'v>) -> Self::Result { ... }
fn visit_pat_field(&mut self, f: &'v PatField<'v>) -> Self::Result { ... }
fn visit_array_length(&mut self, len: &'v ArrayLen<'v>) -> Self::Result { ... }
fn visit_anon_const(&mut self, c: &'v AnonConst) -> Self::Result { ... }
fn visit_inline_const(&mut self, c: &'v ConstBlock) -> Self::Result { ... }
fn visit_const_arg(&mut self, c: &'v ConstArg<'v>) -> Self::Result { ... }
fn visit_expr(&mut self, ex: &'v Expr<'v>) -> Self::Result { ... }
fn visit_expr_field(&mut self, field: &'v ExprField<'v>) -> Self::Result { ... }
fn visit_ty(&mut self, t: &'v Ty<'v>) -> Self::Result { ... }
fn visit_pattern_type_pattern(&mut self, _p: &'v Pat<'v>) { ... }
fn visit_generic_param(&mut self, p: &'v GenericParam<'v>) -> Self::Result { ... }
fn visit_const_param_default(
&mut self,
_param: HirId,
ct: &'v ConstArg<'v>,
) -> Self::Result { ... }
fn visit_generics(&mut self, g: &'v Generics<'v>) -> Self::Result { ... }
fn visit_where_predicate(
&mut self,
predicate: &'v WherePredicate<'v>,
) -> Self::Result { ... }
fn visit_fn_ret_ty(&mut self, ret_ty: &'v FnRetTy<'v>) -> Self::Result { ... }
fn visit_fn_decl(&mut self, fd: &'v FnDecl<'v>) -> Self::Result { ... }
fn visit_fn(
&mut self,
fk: FnKind<'v>,
fd: &'v FnDecl<'v>,
b: BodyId,
_: Span,
id: LocalDefId,
) -> Self::Result { ... }
fn visit_use(
&mut self,
path: &'v UsePath<'v>,
hir_id: HirId,
) -> Self::Result { ... }
fn visit_trait_item(&mut self, ti: &'v TraitItem<'v>) -> Self::Result { ... }
fn visit_trait_item_ref(&mut self, ii: &'v TraitItemRef) -> Self::Result { ... }
fn visit_impl_item(&mut self, ii: &'v ImplItem<'v>) -> Self::Result { ... }
fn visit_foreign_item_ref(&mut self, ii: &'v ForeignItemRef) -> Self::Result { ... }
fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef) -> Self::Result { ... }
fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>) -> Self::Result { ... }
fn visit_param_bound(
&mut self,
bounds: &'v GenericBound<'v>,
) -> Self::Result { ... }
fn visit_precise_capturing_arg(
&mut self,
arg: &'v PreciseCapturingArg<'v>,
) -> Self::Result { ... }
fn visit_poly_trait_ref(&mut self, t: &'v PolyTraitRef<'v>) -> Self::Result { ... }
fn visit_opaque_ty(&mut self, opaque: &'v OpaqueTy<'v>) -> Self::Result { ... }
fn visit_variant_data(&mut self, s: &'v VariantData<'v>) -> Self::Result { ... }
fn visit_field_def(&mut self, s: &'v FieldDef<'v>) -> Self::Result { ... }
fn visit_enum_def(
&mut self,
enum_definition: &'v EnumDef<'v>,
item_id: HirId,
) -> Self::Result { ... }
fn visit_variant(&mut self, v: &'v Variant<'v>) -> Self::Result { ... }
fn visit_label(&mut self, label: &'v Label) -> Self::Result { ... }
fn visit_infer(&mut self, inf: &'v InferArg) -> Self::Result { ... }
fn visit_generic_arg(
&mut self,
generic_arg: &'v GenericArg<'v>,
) -> Self::Result { ... }
fn visit_lifetime(&mut self, lifetime: &'v Lifetime) -> Self::Result { ... }
fn visit_qpath(
&mut self,
qpath: &'v QPath<'v>,
id: HirId,
_span: Span,
) -> Self::Result { ... }
fn visit_path(&mut self, path: &Path<'v>, _id: HirId) -> Self::Result { ... }
fn visit_path_segment(
&mut self,
path_segment: &'v PathSegment<'v>,
) -> Self::Result { ... }
fn visit_generic_args(
&mut self,
generic_args: &'v GenericArgs<'v>,
) -> Self::Result { ... }
fn visit_assoc_item_constraint(
&mut self,
constraint: &'v AssocItemConstraint<'v>,
) -> Self::Result { ... }
fn visit_attribute(&mut self, _attr: &'v Attribute) -> Self::Result { ... }
fn visit_associated_item_kind(
&mut self,
kind: &'v AssocItemKind,
) -> Self::Result { ... }
fn visit_defaultness(
&mut self,
defaultness: &'v Defaultness,
) -> Self::Result { ... }
fn visit_inline_asm(
&mut self,
asm: &'v InlineAsm<'v>,
id: HirId,
) -> Self::Result { ... }
}
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 tcx.hir().visit_all_item_likes_in_crate
. 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.)
Provided Associated Types§
type Map: Map<'v> = <Self::NestedFilter as NestedFilter<'v>>::Map
sourcetype NestedFilter: NestedFilter<'v> = None
type NestedFilter: NestedFilter<'v> = None
Override this type to control which nested HIR are visited; see
NestedFilter
for details. If you override this type, you
must also override nested_visit_map
.
If for some reason you want the nested behavior, but don’t
have a Map
at your disposal: then override the
visit_nested_XXX
methods. If a new visit_nested_XXX
variant is
added in the future, it will cause a panic which can be detected
and fixed appropriately.
sourcetype Result: VisitorResult = ()
type Result: VisitorResult = ()
The result type of the visit_*
methods. Can be either ()
,
or ControlFlow<T>
.
Provided Methods§
sourcefn nested_visit_map(&mut self) -> Self::Map
fn nested_visit_map(&mut self) -> Self::Map
If type NestedFilter
is set to visit nested items, this method
must also be overridden to provide a map to retrieve nested items.
sourcefn visit_nested_item(&mut self, id: ItemId) -> Self::Result
fn visit_nested_item(&mut self, id: ItemId) -> Self::Result
Invoked when a nested item is encountered. By default, when
Self::NestedFilter
is nested_filter::None
, this method does
nothing. You probably don’t want to override this method –
instead, override Self::NestedFilter
or use the “shallow” or
“deep” visit patterns described at
rustc_hir::intravisit
. 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.
sourcefn visit_nested_trait_item(&mut self, id: TraitItemId) -> Self::Result
fn visit_nested_trait_item(&mut self, id: TraitItemId) -> Self::Result
Like visit_nested_item()
, but for trait items. See
visit_nested_item()
for advice on when to override this
method.
sourcefn visit_nested_impl_item(&mut self, id: ImplItemId) -> Self::Result
fn visit_nested_impl_item(&mut self, id: ImplItemId) -> Self::Result
Like visit_nested_item()
, but for impl items. See
visit_nested_item()
for advice on when to override this
method.
sourcefn visit_nested_foreign_item(&mut self, id: ForeignItemId) -> Self::Result
fn visit_nested_foreign_item(&mut self, id: ForeignItemId) -> Self::Result
Like visit_nested_item()
, but for foreign items. See
visit_nested_item()
for advice on when to override this
method.
sourcefn visit_nested_body(&mut self, id: BodyId) -> Self::Result
fn visit_nested_body(&mut self, id: BodyId) -> Self::Result
Invoked to visit the body of a function, method or closure. Like
visit_nested_item
, does nothing by default unless you override
Self::NestedFilter
.
fn visit_param(&mut self, param: &'v Param<'v>) -> Self::Result
sourcefn visit_item(&mut self, i: &'v Item<'v>) -> Self::Result
fn visit_item(&mut self, i: &'v Item<'v>) -> Self::Result
Visits the top-level item and (optionally) nested items / impl items. See
visit_nested_item
for details.