Available on crate feature
visit only.Expand description
Syntax tree traversal to walk a shared borrow of a syntax tree.
Each method of the Visit trait is a hook that can be overridden to
customize the behavior when visiting the corresponding type of node. By
default, every method recursively visits the substructure of the input
by invoking the right visitor method of each of its fields.
pub trait Visit<'ast> {
/* ... */
fn visit_expr_binary(&mut self, node: &'ast ExprBinary) {
visit_expr_binary(self, node);
}
/* ... */
}
pub fn visit_expr_binary<'ast, V>(v: &mut V, node: &'ast ExprBinary)
where
V: Visit<'ast> + ?Sized,
{
for attr in &node.attrs {
v.visit_attribute(attr);
}
v.visit_expr(&*node.left);
v.visit_bin_op(&node.op);
v.visit_expr(&*node.right);
}
/* ... */§Example
This visitor will print the name of every freestanding function in the syntax tree, including nested functions.
// [dependencies]
// quote = "1.0"
// syn = { version = "2.0", features = ["full", "visit"] }
use quote::quote;
use syn::visit::{self, Visit};
use syn::{File, ItemFn};
struct FnVisitor;
impl<'ast> Visit<'ast> for FnVisitor {
fn visit_item_fn(&mut self, node: &'ast ItemFn) {
println!("Function with name={}", node.sig.ident);
// Delegate to the default impl to visit any nested functions.
visit::visit_item_fn(self, node);
}
}
fn main() {
let code = quote! {
pub fn f() {
fn g() {}
}
};
let syntax_tree: File = syn::parse2(code).unwrap();
FnVisitor.visit_file(&syntax_tree);
}The 'ast lifetime on the input references means that the syntax tree
outlives the complete recursive visit call, so the visitor is allowed to
hold on to references into the syntax tree.
use quote::quote;
use syn::visit::{self, Visit};
use syn::{File, ItemFn};
struct FnVisitor<'ast> {
functions: Vec<&'ast ItemFn>,
}
impl<'ast> Visit<'ast> for FnVisitor<'ast> {
fn visit_item_fn(&mut self, node: &'ast ItemFn) {
self.functions.push(node);
visit::visit_item_fn(self, node);
}
}
fn main() {
let code = quote! {
pub fn f() {
fn g() {}
}
};
let syntax_tree: File = syn::parse2(code).unwrap();
let mut visitor = FnVisitor { functions: Vec::new() };
visitor.visit_file(&syntax_tree);
for f in visitor.functions {
println!("Function with name={}", f.sig.ident);
}
}Traits§
- Syntax tree traversal to walk a shared borrow of a syntax tree.
Functions§
- visit_abi
deriveorfull - visit_angle_bracketed_generic_arguments
deriveorfull - visit_arm
full - visit_assoc_const
deriveorfull - visit_assoc_type
deriveorfull - visit_attr_style
deriveorfull - visit_attribute
deriveorfull - visit_bare_fn_arg
deriveorfull - visit_bare_variadic
deriveorfull - visit_bin_op
deriveorfull - visit_block
full - visit_bound_lifetimes
deriveorfull - visit_const_param
deriveorfull - visit_constraint
deriveorfull - visit_data
derive - visit_data_enum
derive - visit_data_struct
derive - visit_data_union
derive - visit_derive_input
derive - visit_expr
deriveorfull - visit_expr_array
full - visit_expr_async
full - visit_expr_await
full - visit_expr_binary
deriveorfull - visit_expr_block
full - visit_expr_break
full - visit_expr_call
deriveorfull - visit_expr_cast
deriveorfull - visit_expr_const
full - visit_expr_field
deriveorfull - visit_expr_group
deriveorfull - visit_expr_if
full - visit_expr_index
deriveorfull - visit_expr_infer
full - visit_expr_let
full - visit_expr_lit
deriveorfull - visit_expr_loop
full - visit_expr_macro
deriveorfull - visit_expr_match
full - visit_expr_method_call
deriveorfull - visit_expr_paren
deriveorfull - visit_expr_path
deriveorfull - visit_expr_range
full - visit_expr_reference
deriveorfull - visit_expr_struct
deriveorfull - visit_expr_try
full - visit_expr_tuple
full - visit_expr_unary
deriveorfull - visit_expr_while
full - visit_expr_yield
full - visit_field
deriveorfull - visit_field_mutability
deriveorfull - visit_field_pat
full - visit_field_value
deriveorfull - visit_fields
deriveorfull - visit_fields_named
deriveorfull - visit_fields_unnamed
deriveorfull - visit_file
full - visit_fn_arg
full - visit_generic_argument
deriveorfull - visit_generic_param
deriveorfull - visit_generics
deriveorfull - visit_impl_item
full - visit_index
deriveorfull - visit_item
full - visit_item_const
full - visit_item_enum
full - visit_item_fn
full - visit_item_impl
full - visit_item_macro
full - visit_item_mod
full - visit_item_trait
full - visit_item_type
full - visit_item_union
full - visit_item_use
full - visit_label
full - visit_lifetime_param
deriveorfull - visit_local
full - visit_local_init
full - visit_macro
deriveorfull - visit_macro_delimiter
deriveorfull - visit_member
deriveorfull - visit_meta
deriveorfull - visit_meta_list
deriveorfull - visit_meta_name_value
deriveorfull - visit_parenthesized_generic_arguments
deriveorfull - visit_pat
full - visit_pat_ident
full - visit_pat_or
full - visit_pat_paren
full - visit_pat_rest
full - visit_pat_slice
full - visit_pat_struct
full - visit_pat_tuple
full - visit_pat_type
full - visit_pat_wild
full - visit_path
deriveorfull - visit_path_arguments
deriveorfull - visit_path_segment
deriveorfull - visit_predicate_lifetime
deriveorfull - visit_predicate_type
deriveorfull - visit_qself
deriveorfull - visit_receiver
full - visit_return_type
deriveorfull - visit_signature
full - visit_stmt
full - visit_stmt_macro
full - visit_trait_bound
deriveorfull - visit_trait_bound_modifier
deriveorfull - visit_trait_item
full - visit_type
deriveorfull - visit_type_array
deriveorfull - visit_type_bare_fn
deriveorfull - visit_type_group
deriveorfull - visit_type_impl_trait
deriveorfull - visit_type_infer
deriveorfull - visit_type_macro
deriveorfull - visit_type_never
deriveorfull - visit_type_param
deriveorfull - visit_type_param_bound
deriveorfull - visit_type_paren
deriveorfull - visit_type_path
deriveorfull - visit_type_ptr
deriveorfull - visit_type_reference
deriveorfull - visit_type_slice
deriveorfull - visit_type_trait_object
deriveorfull - visit_type_tuple
deriveorfull - visit_un_op
deriveorfull - visit_use_glob
full - visit_use_group
full - visit_use_name
full - visit_use_path
full - visit_use_rename
full - visit_use_tree
full - visit_variadic
full - visit_variant
deriveorfull - visit_vis_restricted
deriveorfull - visit_visibility
deriveorfull - visit_where_clause
deriveorfull - visit_where_predicate
deriveorfull