Module visit

Source
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§

Visit
Syntax tree traversal to walk a shared borrow of a syntax tree.

Functions§

visit_abiderive or full
visit_angle_bracketed_generic_argumentsderive or full
visit_armfull
visit_assoc_constderive or full
visit_assoc_typederive or full
visit_attr_stylederive or full
visit_attributederive or full
visit_bare_fn_argderive or full
visit_bare_variadicderive or full
visit_bin_opderive or full
visit_blockfull
visit_bound_lifetimesderive or full
visit_captured_paramfull
visit_const_paramderive or full
visit_constraintderive or full
visit_dataderive
visit_data_enumderive
visit_data_structderive
visit_data_unionderive
visit_derive_inputderive
visit_exprderive or full
visit_expr_arrayfull
visit_expr_assignfull
visit_expr_asyncfull
visit_expr_awaitfull
visit_expr_binaryderive or full
visit_expr_blockfull
visit_expr_breakfull
visit_expr_callderive or full
visit_expr_castderive or full
visit_expr_closurefull
visit_expr_constfull
visit_expr_continuefull
visit_expr_fieldderive or full
visit_expr_for_loopfull
visit_expr_groupderive or full
visit_expr_iffull
visit_expr_indexderive or full
visit_expr_inferfull
visit_expr_letfull
visit_expr_litderive or full
visit_expr_loopfull
visit_expr_macroderive or full
visit_expr_matchfull
visit_expr_method_callderive or full
visit_expr_parenderive or full
visit_expr_pathderive or full
visit_expr_rangefull
visit_expr_raw_addrfull
visit_expr_referencederive or full
visit_expr_repeatfull
visit_expr_returnfull
visit_expr_structderive or full
visit_expr_tryfull
visit_expr_try_blockfull
visit_expr_tuplederive or full
visit_expr_unaryderive or full
visit_expr_unsafefull
visit_expr_whilefull
visit_expr_yieldfull
visit_fieldderive or full
visit_field_mutabilityderive or full
visit_field_patfull
visit_field_valuederive or full
visit_fieldsderive or full
visit_fields_namedderive or full
visit_fields_unnamedderive or full
visit_filefull
visit_fn_argfull
visit_foreign_itemfull
visit_foreign_item_fnfull
visit_foreign_item_macrofull
visit_foreign_item_staticfull
visit_foreign_item_typefull
visit_generic_argumentderive or full
visit_generic_paramderive or full
visit_genericsderive or full
visit_ident
visit_impl_itemfull
visit_impl_item_constfull
visit_impl_item_fnfull
visit_impl_item_macrofull
visit_impl_item_typefull
visit_impl_restrictionfull
visit_indexderive or full
visit_itemfull
visit_item_constfull
visit_item_enumfull
visit_item_extern_cratefull
visit_item_fnfull
visit_item_foreign_modfull
visit_item_implfull
visit_item_macrofull
visit_item_modfull
visit_item_staticfull
visit_item_structfull
visit_item_traitfull
visit_item_trait_aliasfull
visit_item_typefull
visit_item_unionfull
visit_item_usefull
visit_labelfull
visit_lifetime
visit_lifetime_paramderive or full
visit_lit
visit_lit_bool
visit_lit_byte
visit_lit_byte_str
visit_lit_char
visit_lit_cstr
visit_lit_float
visit_lit_int
visit_lit_str
visit_localfull
visit_local_initfull
visit_macroderive or full
visit_macro_delimiterderive or full
visit_memberderive or full
visit_metaderive or full
visit_meta_listderive or full
visit_meta_name_valuederive or full
visit_parenthesized_generic_argumentsderive or full
visit_patfull
visit_pat_identfull
visit_pat_orfull
visit_pat_parenfull
visit_pat_referencefull
visit_pat_restfull
visit_pat_slicefull
visit_pat_structfull
visit_pat_tuplefull
visit_pat_tuple_structfull
visit_pat_typefull
visit_pat_wildfull
visit_pathderive or full
visit_path_argumentsderive or full
visit_path_segmentderive or full
visit_pointer_mutabilityfull
visit_precise_capturefull
visit_predicate_lifetimederive or full
visit_predicate_typederive or full
visit_qselfderive or full
visit_range_limitsfull
visit_receiverfull
visit_return_typederive or full
visit_signaturefull
visit_span
visit_static_mutabilityfull
visit_stmtfull
visit_stmt_macrofull
visit_trait_boundderive or full
visit_trait_bound_modifierderive or full
visit_trait_itemfull
visit_trait_item_constfull
visit_trait_item_fnfull
visit_trait_item_macrofull
visit_trait_item_typefull
visit_typederive or full
visit_type_arrayderive or full
visit_type_bare_fnderive or full
visit_type_groupderive or full
visit_type_impl_traitderive or full
visit_type_inferderive or full
visit_type_macroderive or full
visit_type_neverderive or full
visit_type_paramderive or full
visit_type_param_boundderive or full
visit_type_parenderive or full
visit_type_pathderive or full
visit_type_ptrderive or full
visit_type_referencederive or full
visit_type_slicederive or full
visit_type_trait_objectderive or full
visit_type_tuplederive or full
visit_un_opderive or full
visit_use_globfull
visit_use_groupfull
visit_use_namefull
visit_use_pathfull
visit_use_renamefull
visit_use_treefull
visit_variadicfull
visit_variantderive or full
visit_vis_restrictedderive or full
visit_visibilityderive or full
visit_where_clausederive or full
visit_where_predicatederive or full