Module syn::visit_mut[][src]

This is supported 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);
}

/* ... */

This module is available only if Syn is built with the "visit-mut" feature.


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 = "1.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

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

Functions

visit_abi_mutderive or full
visit_attr_style_mutderive or full
visit_attribute_mutderive or full
visit_bare_fn_arg_mutderive or full
visit_bin_op_mutderive or full
visit_binding_mutderive or full
visit_const_param_mutderive or full
visit_constraint_mutderive or full
visit_expr_binary_mutderive or full
visit_expr_call_mutderive or full
visit_expr_cast_mutderive or full
visit_expr_field_mutderive or full
visit_expr_index_mutderive or full
visit_expr_lit_mutderive or full
visit_expr_mutderive or full
visit_expr_paren_mutderive or full
visit_expr_path_mutderive or full
visit_expr_unary_mutderive or full
visit_field_mutderive or full
visit_fields_mutderive or full
visit_generics_mutderive or full
visit_index_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_nested_meta_mutderive or full
visit_path_mutderive or full
visit_qself_mutderive or full
visit_return_type_mutderive or full
visit_trait_bound_mutderive or full
visit_type_array_mutderive or full
visit_type_group_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_mutderive or full
visit_type_paren_mutderive or full
visit_type_path_mutderive or full
visit_type_ptr_mutderive or full
visit_type_slice_mutderive or full
visit_type_tuple_mutderive or full
visit_un_op_mutderive or full
visit_variadic_mutderive or full
visit_variant_mutderive or full
visit_vis_crate_mutderive or full
visit_vis_public_mutderive or full
visit_visibility_mutderive or full