Module visit_mut

Source
Available on crate feature visit-mut only.
Expand description

Syntax tree traversal to mutate an exclusive borrow of a syntax tree in place.

Each method of the VisitMut trait is a hook that can be overridden to customize the behavior when mutating 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 VisitMut {
    /* ... */

    fn visit_expr_binary_mut(&mut self, node: &mut ExprBinary) {
        visit_expr_binary_mut(self, node);
    }

    /* ... */
}

pub fn visit_expr_binary_mut<V>(v: &mut V, node: &mut ExprBinary)
where
    V: VisitMut + ?Sized,
{
    for attr in &mut node.attrs {
        v.visit_attribute_mut(attr);
    }
    v.visit_expr_mut(&mut *node.left);
    v.visit_bin_op_mut(&mut node.op);
    v.visit_expr_mut(&mut *node.right);
}

/* ... */

§Example

This mut visitor replace occurrences of u256 suffixed integer literals like 999u256 with a macro invocation bigint::u256!(999).

// [dependencies]
// quote = "1.0"
// syn = { version = "2.0", features = ["full", "visit-mut"] }

use quote::quote;
use syn::visit_mut::{self, VisitMut};
use syn::{parse_quote, Expr, File, Lit, LitInt};

struct BigintReplace;

impl VisitMut for BigintReplace {
    fn visit_expr_mut(&mut self, node: &mut Expr) {
        if let Expr::Lit(expr) = &node {
            if let Lit::Int(int) = &expr.lit {
                if int.suffix() == "u256" {
                    let digits = int.base10_digits();
                    let unsuffixed: LitInt = syn::parse_str(digits).unwrap();
                    *node = parse_quote!(bigint::u256!(#unsuffixed));
                    return;
                }
            }
        }

        // Delegate to the default impl to visit nested expressions.
        visit_mut::visit_expr_mut(self, node);
    }
}

fn main() {
    let code = quote! {
        fn main() {
            let _ = 999u256;
        }
    };

    let mut syntax_tree: File = syn::parse2(code).unwrap();
    BigintReplace.visit_file_mut(&mut syntax_tree);
    println!("{}", quote!(#syntax_tree));
}

Traits§

VisitMut
Syntax tree traversal to mutate an exclusive borrow of a syntax tree in place.

Functions§

visit_abi_mutderive or full
visit_angle_bracketed_generic_arguments_mutderive or full
visit_arm_mutfull
visit_assoc_const_mutderive or full
visit_assoc_type_mutderive or full
visit_attr_style_mutderive or full
visit_attribute_mutderive or full
visit_bare_fn_arg_mutderive or full
visit_bare_variadic_mutderive or full
visit_bin_op_mutderive or full
visit_block_mutfull
visit_bound_lifetimes_mutderive or full
visit_captured_param_mutfull
visit_const_param_mutderive or full
visit_constraint_mutderive or full
visit_data_enum_mutderive
visit_data_mutderive
visit_data_struct_mutderive
visit_data_union_mutderive
visit_derive_input_mutderive
visit_expr_array_mutfull
visit_expr_assign_mutfull
visit_expr_async_mutfull
visit_expr_await_mutfull
visit_expr_binary_mutderive or full
visit_expr_block_mutfull
visit_expr_break_mutfull
visit_expr_call_mutderive or full
visit_expr_cast_mutderive or full
visit_expr_closure_mutfull
visit_expr_const_mutfull
visit_expr_continue_mutfull
visit_expr_field_mutderive or full
visit_expr_for_loop_mutfull
visit_expr_group_mutderive or full
visit_expr_if_mutfull
visit_expr_index_mutderive or full
visit_expr_infer_mutfull
visit_expr_let_mutfull
visit_expr_lit_mutderive or full
visit_expr_loop_mutfull
visit_expr_macro_mutderive or full
visit_expr_match_mutfull
visit_expr_method_call_mutderive or full
visit_expr_mutderive or full
visit_expr_paren_mutderive or full
visit_expr_path_mutderive or full
visit_expr_range_mutfull
visit_expr_raw_addr_mutfull
visit_expr_reference_mutderive or full
visit_expr_repeat_mutfull
visit_expr_return_mutfull
visit_expr_struct_mutderive or full
visit_expr_try_block_mutfull
visit_expr_try_mutfull
visit_expr_tuple_mutderive or full
visit_expr_unary_mutderive or full
visit_expr_unsafe_mutfull
visit_expr_while_mutfull
visit_expr_yield_mutfull
visit_field_mutderive or full
visit_field_mutability_mutderive or full
visit_field_pat_mutfull
visit_field_value_mutderive or full
visit_fields_mutderive or full
visit_fields_named_mutderive or full
visit_fields_unnamed_mutderive or full
visit_file_mutfull
visit_fn_arg_mutfull
visit_foreign_item_fn_mutfull
visit_foreign_item_macro_mutfull
visit_foreign_item_mutfull
visit_foreign_item_static_mutfull
visit_foreign_item_type_mutfull
visit_generic_argument_mutderive or full
visit_generic_param_mutderive or full
visit_generics_mutderive or full
visit_ident_mut
visit_impl_item_const_mutfull
visit_impl_item_fn_mutfull
visit_impl_item_macro_mutfull
visit_impl_item_mutfull
visit_impl_item_type_mutfull
visit_impl_restriction_mutfull
visit_index_mutderive or full
visit_item_const_mutfull
visit_item_enum_mutfull
visit_item_extern_crate_mutfull
visit_item_fn_mutfull
visit_item_foreign_mod_mutfull
visit_item_impl_mutfull
visit_item_macro_mutfull
visit_item_mod_mutfull
visit_item_mutfull
visit_item_static_mutfull
visit_item_struct_mutfull
visit_item_trait_alias_mutfull
visit_item_trait_mutfull
visit_item_type_mutfull
visit_item_union_mutfull
visit_item_use_mutfull
visit_label_mutfull
visit_lifetime_mut
visit_lifetime_param_mutderive or full
visit_lit_bool_mut
visit_lit_byte_mut
visit_lit_byte_str_mut
visit_lit_char_mut
visit_lit_cstr_mut
visit_lit_float_mut
visit_lit_int_mut
visit_lit_mut
visit_lit_str_mut
visit_local_init_mutfull
visit_local_mutfull
visit_macro_delimiter_mutderive or full
visit_macro_mutderive or full
visit_member_mutderive or full
visit_meta_list_mutderive or full
visit_meta_mutderive or full
visit_meta_name_value_mutderive or full
visit_parenthesized_generic_arguments_mutderive or full
visit_pat_ident_mutfull
visit_pat_mutfull
visit_pat_or_mutfull
visit_pat_paren_mutfull
visit_pat_reference_mutfull
visit_pat_rest_mutfull
visit_pat_slice_mutfull
visit_pat_struct_mutfull
visit_pat_tuple_mutfull
visit_pat_tuple_struct_mutfull
visit_pat_type_mutfull
visit_pat_wild_mutfull
visit_path_arguments_mutderive or full
visit_path_mutderive or full
visit_path_segment_mutderive or full
visit_pointer_mutability_mutfull
visit_precise_capture_mutfull
visit_predicate_lifetime_mutderive or full
visit_predicate_type_mutderive or full
visit_qself_mutderive or full
visit_range_limits_mutfull
visit_receiver_mutfull
visit_return_type_mutderive or full
visit_signature_mutfull
visit_span_mut
visit_static_mutability_mutfull
visit_stmt_macro_mutfull
visit_stmt_mutfull
visit_trait_bound_modifier_mutderive or full
visit_trait_bound_mutderive or full
visit_trait_item_const_mutfull
visit_trait_item_fn_mutfull
visit_trait_item_macro_mutfull
visit_trait_item_mutfull
visit_trait_item_type_mutfull
visit_type_array_mutderive or full
visit_type_bare_fn_mutderive or full
visit_type_group_mutderive or full
visit_type_impl_trait_mutderive or full
visit_type_infer_mutderive or full
visit_type_macro_mutderive or full
visit_type_mutderive or full
visit_type_never_mutderive or full
visit_type_param_bound_mutderive or full
visit_type_param_mutderive or full
visit_type_paren_mutderive or full
visit_type_path_mutderive or full
visit_type_ptr_mutderive or full
visit_type_reference_mutderive or full
visit_type_slice_mutderive or full
visit_type_trait_object_mutderive or full
visit_type_tuple_mutderive or full
visit_un_op_mutderive or full
visit_use_glob_mutfull
visit_use_group_mutfull
visit_use_name_mutfull
visit_use_path_mutfull
visit_use_rename_mutfull
visit_use_tree_mutfull
visit_variadic_mutfull
visit_variant_mutderive or full
visit_vis_restricted_mutderive or full
visit_visibility_mutderive or full
visit_where_clause_mutderive or full
visit_where_predicate_mutderive or full