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§
- Visit
Mut - Syntax tree traversal to mutate an exclusive borrow of a syntax tree in place.
Functions§
- visit_
abi_ mut - visit_
angle_ bracketed_ generic_ arguments_ mut - visit_
arm_ mut - visit_
assoc_ const_ mut - visit_
assoc_ type_ mut - visit_
attr_ style_ mut - visit_
attribute_ mut - visit_
bare_ fn_ arg_ mut - visit_
bare_ variadic_ mut - visit_
bin_ op_ mut - visit_
block_ mut - visit_
bound_ lifetimes_ mut - visit_
captured_ param_ mut - visit_
const_ param_ mut - visit_
constraint_ mut - visit_
data_ enum_ mut - visit_
data_ mut - visit_
data_ struct_ mut - visit_
data_ union_ mut - visit_
derive_ input_ mut - visit_
expr_ array_ mut - visit_
expr_ assign_ mut - visit_
expr_ async_ mut - visit_
expr_ await_ mut - visit_
expr_ binary_ mut - visit_
expr_ block_ mut - visit_
expr_ break_ mut - visit_
expr_ call_ mut - visit_
expr_ cast_ mut - visit_
expr_ closure_ mut - visit_
expr_ const_ mut - visit_
expr_ continue_ mut - visit_
expr_ field_ mut - visit_
expr_ for_ loop_ mut - visit_
expr_ group_ mut - visit_
expr_ if_ mut - visit_
expr_ index_ mut - visit_
expr_ infer_ mut - visit_
expr_ let_ mut - visit_
expr_ lit_ mut - visit_
expr_ loop_ mut - visit_
expr_ macro_ mut - visit_
expr_ match_ mut - visit_
expr_ method_ call_ mut - visit_
expr_ mut - visit_
expr_ paren_ mut - visit_
expr_ path_ mut - visit_
expr_ range_ mut - visit_
expr_ raw_ addr_ mut - visit_
expr_ reference_ mut - visit_
expr_ repeat_ mut - visit_
expr_ return_ mut - visit_
expr_ struct_ mut - visit_
expr_ try_ block_ mut - visit_
expr_ try_ mut - visit_
expr_ tuple_ mut - visit_
expr_ unary_ mut - visit_
expr_ unsafe_ mut - visit_
expr_ while_ mut - visit_
expr_ yield_ mut - visit_
field_ mut - visit_
field_ mutability_ mut - visit_
field_ pat_ mut - visit_
field_ value_ mut - visit_
fields_ mut - visit_
fields_ named_ mut - visit_
fields_ unnamed_ mut - visit_
file_ mut - visit_
fn_ arg_ mut - visit_
foreign_ item_ fn_ mut - visit_
foreign_ item_ macro_ mut - visit_
foreign_ item_ mut - visit_
foreign_ item_ static_ mut - visit_
foreign_ item_ type_ mut - visit_
generic_ argument_ mut - visit_
generic_ param_ mut - visit_
generics_ mut - visit_
ident_ mut - visit_
impl_ item_ const_ mut - visit_
impl_ item_ fn_ mut - visit_
impl_ item_ macro_ mut - visit_
impl_ item_ mut - visit_
impl_ item_ type_ mut - visit_
impl_ restriction_ mut - visit_
index_ mut - visit_
item_ const_ mut - visit_
item_ enum_ mut - visit_
item_ extern_ crate_ mut - visit_
item_ fn_ mut - visit_
item_ foreign_ mod_ mut - visit_
item_ impl_ mut - visit_
item_ macro_ mut - visit_
item_ mod_ mut - visit_
item_ mut - visit_
item_ static_ mut - visit_
item_ struct_ mut - visit_
item_ trait_ alias_ mut - visit_
item_ trait_ mut - visit_
item_ type_ mut - visit_
item_ union_ mut - visit_
item_ use_ mut - visit_
label_ mut - visit_
lifetime_ mut - visit_
lifetime_ param_ mut - 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_ mut - visit_
local_ mut - visit_
macro_ delimiter_ mut - visit_
macro_ mut - visit_
member_ mut - visit_
meta_ list_ mut - visit_
meta_ mut - visit_
meta_ name_ value_ mut - visit_
parenthesized_ generic_ arguments_ mut - visit_
pat_ ident_ mut - visit_
pat_ mut - visit_
pat_ or_ mut - visit_
pat_ paren_ mut - visit_
pat_ reference_ mut - visit_
pat_ rest_ mut - visit_
pat_ slice_ mut - visit_
pat_ struct_ mut - visit_
pat_ tuple_ mut - visit_
pat_ tuple_ struct_ mut - visit_
pat_ type_ mut - visit_
pat_ wild_ mut - visit_
path_ arguments_ mut - visit_
path_ mut - visit_
path_ segment_ mut - visit_
pointer_ mutability_ mut - visit_
precise_ capture_ mut - visit_
predicate_ lifetime_ mut - visit_
predicate_ type_ mut - visit_
qself_ mut - visit_
range_ limits_ mut - visit_
receiver_ mut - visit_
return_ type_ mut - visit_
signature_ mut - visit_
span_ mut - visit_
static_ mutability_ mut - visit_
stmt_ macro_ mut - visit_
stmt_ mut - visit_
trait_ bound_ modifier_ mut - visit_
trait_ bound_ mut - visit_
trait_ item_ const_ mut - visit_
trait_ item_ fn_ mut - visit_
trait_ item_ macro_ mut - visit_
trait_ item_ mut - visit_
trait_ item_ type_ mut - visit_
type_ array_ mut - visit_
type_ bare_ fn_ mut - visit_
type_ group_ mut - visit_
type_ impl_ trait_ mut - visit_
type_ infer_ mut - visit_
type_ macro_ mut - visit_
type_ mut - visit_
type_ never_ mut - visit_
type_ param_ bound_ mut - visit_
type_ param_ mut - visit_
type_ paren_ mut - visit_
type_ path_ mut - visit_
type_ ptr_ mut - visit_
type_ reference_ mut - visit_
type_ slice_ mut - visit_
type_ trait_ object_ mut - visit_
type_ tuple_ mut - visit_
un_ op_ mut - visit_
use_ glob_ mut - visit_
use_ group_ mut - visit_
use_ name_ mut - visit_
use_ path_ mut - visit_
use_ rename_ mut - visit_
use_ tree_ mut - visit_
variadic_ mut - visit_
variant_ mut - visit_
vis_ restricted_ mut - visit_
visibility_ mut - visit_
where_ clause_ mut - visit_
where_ predicate_ mut