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§
- Syntax tree traversal to mutate an exclusive borrow of a syntax tree in place.
Functions§
- visit_abi_mut
deriveorfull - visit_angle_bracketed_generic_arguments_mut
deriveorfull - visit_arm_mut
full - visit_assoc_const_mut
deriveorfull - visit_assoc_type_mut
deriveorfull - visit_attr_style_mut
deriveorfull - visit_attribute_mut
deriveorfull - visit_bare_fn_arg_mut
deriveorfull - visit_bare_variadic_mut
deriveorfull - visit_bin_op_mut
deriveorfull - visit_block_mut
full - visit_bound_lifetimes_mut
deriveorfull - visit_const_param_mut
deriveorfull - visit_constraint_mut
deriveorfull - visit_data_enum_mut
derive - visit_data_mut
derive - visit_data_struct_mut
derive - visit_data_union_mut
derive - visit_derive_input_mut
derive - visit_expr_binary_mut
deriveorfull - visit_expr_call_mut
deriveorfull - visit_expr_cast_mut
deriveorfull - visit_expr_field_mut
deriveorfull - visit_expr_group_mut
deriveorfull - visit_expr_index_mut
deriveorfull - visit_expr_lit_mut
deriveorfull - visit_expr_macro_mut
deriveorfull - visit_expr_method_call_mut
deriveorfull - visit_expr_mut
deriveorfull - visit_expr_paren_mut
deriveorfull - visit_expr_path_mut
deriveorfull - visit_expr_reference_mut
deriveorfull - visit_expr_struct_mut
deriveorfull - visit_expr_unary_mut
deriveorfull - visit_field_mut
deriveorfull - visit_field_mutability_mut
deriveorfull - visit_field_value_mut
deriveorfull - visit_fields_mut
deriveorfull - visit_fields_named_mut
deriveorfull - visit_fields_unnamed_mut
deriveorfull - visit_file_mut
full - visit_fn_arg_mut
full - visit_generic_argument_mut
deriveorfull - visit_generic_param_mut
deriveorfull - visit_generics_mut
deriveorfull - visit_index_mut
deriveorfull - visit_item_mut
full - visit_label_mut
full - visit_lifetime_param_mut
deriveorfull - visit_local_mut
full - visit_macro_delimiter_mut
deriveorfull - visit_macro_mut
deriveorfull - visit_member_mut
deriveorfull - visit_meta_list_mut
deriveorfull - visit_meta_mut
deriveorfull - visit_meta_name_value_mut
deriveorfull - visit_parenthesized_generic_arguments_mut
deriveorfull - visit_pat_mut
full - visit_pat_or_mut
full - visit_path_arguments_mut
deriveorfull - visit_path_mut
deriveorfull - visit_path_segment_mut
deriveorfull - visit_predicate_lifetime_mut
deriveorfull - visit_predicate_type_mut
deriveorfull - visit_qself_mut
deriveorfull - visit_return_type_mut
deriveorfull - visit_stmt_mut
full - visit_trait_bound_modifier_mut
deriveorfull - visit_trait_bound_mut
deriveorfull - visit_type_array_mut
deriveorfull - visit_type_bare_fn_mut
deriveorfull - visit_type_group_mut
deriveorfull - visit_type_impl_trait_mut
deriveorfull - visit_type_infer_mut
deriveorfull - visit_type_macro_mut
deriveorfull - visit_type_mut
deriveorfull - visit_type_never_mut
deriveorfull - visit_type_param_bound_mut
deriveorfull - visit_type_param_mut
deriveorfull - visit_type_paren_mut
deriveorfull - visit_type_path_mut
deriveorfull - visit_type_ptr_mut
deriveorfull - visit_type_reference_mut
deriveorfull - visit_type_slice_mut
deriveorfull - visit_type_trait_object_mut
deriveorfull - visit_type_tuple_mut
deriveorfull - visit_un_op_mut
deriveorfull - visit_variant_mut
deriveorfull - visit_vis_restricted_mut
deriveorfull - visit_visibility_mut
deriveorfull - visit_where_clause_mut
deriveorfull - visit_where_predicate_mut
deriveorfull