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.
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
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.