Expand description
Syntax tree traversal to transform the nodes of an owned syntax tree.
Each method of the Fold
trait is a hook that can be overridden to
customize the behavior when transforming 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 Fold {
/* ... */
fn fold_expr_binary(&mut self, node: ExprBinary) -> ExprBinary {
fold_expr_binary(self, node)
}
/* ... */
}
pub fn fold_expr_binary<V>(v: &mut V, node: ExprBinary) -> ExprBinary
where
V: Fold + ?Sized,
{
ExprBinary {
attrs: node
.attrs
.into_iter()
.map(|attr| v.fold_attribute(attr))
.collect(),
left: Box::new(v.fold_expr(*node.left)),
op: v.fold_bin_op(node.op),
right: Box::new(v.fold_expr(*node.right)),
}
}
/* ... */
§Example
This fold inserts parentheses to fully parenthesizes any expression.
// [dependencies]
// quote = "1.0"
// syn = { version = "2.0", features = ["fold", "full"] }
use quote::quote;
use syn::fold::{fold_expr, Fold};
use syn::{token, Expr, ExprParen};
struct ParenthesizeEveryExpr;
impl Fold for ParenthesizeEveryExpr {
fn fold_expr(&mut self, expr: Expr) -> Expr {
Expr::Paren(ExprParen {
attrs: Vec::new(),
expr: Box::new(fold_expr(self, expr)),
paren_token: token::Paren::default(),
})
}
}
fn main() {
let code = quote! { a() + b(1) * c.d };
let expr: Expr = syn::parse2(code).unwrap();
let parenthesized = ParenthesizeEveryExpr.fold_expr(expr);
println!("{}", quote!(#parenthesized));
// Output: (((a)()) + (((b)((1))) * ((c).d)))
}
Traits§
- Fold
- Syntax tree traversal to transform the nodes of an owned syntax tree.
Functions§
- fold_
abi - fold_
angle_ bracketed_ generic_ arguments - fold_
arm - fold_
assoc_ const - fold_
assoc_ type - fold_
attr_ style - fold_
attribute - fold_
bare_ fn_ arg - fold_
bare_ variadic - fold_
bin_ op - fold_
block - fold_
bound_ lifetimes - fold_
captured_ param - fold_
const_ param - fold_
constraint - fold_
data - fold_
data_ enum - fold_
data_ struct - fold_
data_ union - fold_
derive_ input - fold_
expr - fold_
expr_ array - fold_
expr_ assign - fold_
expr_ async - fold_
expr_ await - fold_
expr_ binary - fold_
expr_ block - fold_
expr_ break - fold_
expr_ call - fold_
expr_ cast - fold_
expr_ closure - fold_
expr_ const - fold_
expr_ continue - fold_
expr_ field - fold_
expr_ for_ loop - fold_
expr_ group - fold_
expr_ if - fold_
expr_ index - fold_
expr_ infer - fold_
expr_ let - fold_
expr_ lit - fold_
expr_ loop - fold_
expr_ macro - fold_
expr_ match - fold_
expr_ method_ call - fold_
expr_ paren - fold_
expr_ path - fold_
expr_ range - fold_
expr_ raw_ addr - fold_
expr_ reference - fold_
expr_ repeat - fold_
expr_ return - fold_
expr_ struct - fold_
expr_ try - fold_
expr_ try_ block - fold_
expr_ tuple - fold_
expr_ unary - fold_
expr_ unsafe - fold_
expr_ while - fold_
expr_ yield - fold_
field - fold_
field_ mutability - fold_
field_ pat - fold_
field_ value - fold_
fields - fold_
fields_ named - fold_
fields_ unnamed - fold_
file - fold_
fn_ arg - fold_
foreign_ item - fold_
foreign_ item_ fn - fold_
foreign_ item_ macro - fold_
foreign_ item_ static - fold_
foreign_ item_ type - fold_
generic_ argument - fold_
generic_ param - fold_
generics - fold_
ident - fold_
impl_ item - fold_
impl_ item_ const - fold_
impl_ item_ fn - fold_
impl_ item_ macro - fold_
impl_ item_ type - fold_
impl_ restriction - fold_
index - fold_
item - fold_
item_ const - fold_
item_ enum - fold_
item_ extern_ crate - fold_
item_ fn - fold_
item_ foreign_ mod - fold_
item_ impl - fold_
item_ macro - fold_
item_ mod - fold_
item_ static - fold_
item_ struct - fold_
item_ trait - fold_
item_ trait_ alias - fold_
item_ type - fold_
item_ union - fold_
item_ use - fold_
label - fold_
lifetime - fold_
lifetime_ param - fold_
lit - fold_
lit_ bool - fold_
lit_ byte - fold_
lit_ byte_ str - fold_
lit_ char - fold_
lit_ cstr - fold_
lit_ float - fold_
lit_ int - fold_
lit_ str - fold_
local - fold_
local_ init - fold_
macro - fold_
macro_ delimiter - fold_
member - fold_
meta - fold_
meta_ list - fold_
meta_ name_ value - fold_
parenthesized_ generic_ arguments - fold_
pat - fold_
pat_ ident - fold_
pat_ or - fold_
pat_ paren - fold_
pat_ reference - fold_
pat_ rest - fold_
pat_ slice - fold_
pat_ struct - fold_
pat_ tuple - fold_
pat_ tuple_ struct - fold_
pat_ type - fold_
pat_ wild - fold_
path - fold_
path_ arguments - fold_
path_ segment - fold_
pointer_ mutability - fold_
precise_ capture - fold_
predicate_ lifetime - fold_
predicate_ type - fold_
qself - fold_
range_ limits - fold_
receiver - fold_
return_ type - fold_
signature - fold_
span - fold_
static_ mutability - fold_
stmt - fold_
stmt_ macro - fold_
trait_ bound - fold_
trait_ bound_ modifier - fold_
trait_ item - fold_
trait_ item_ const - fold_
trait_ item_ fn - fold_
trait_ item_ macro - fold_
trait_ item_ type - fold_
type - fold_
type_ array - fold_
type_ bare_ fn - fold_
type_ group - fold_
type_ impl_ trait - fold_
type_ infer - fold_
type_ macro - fold_
type_ never - fold_
type_ param - fold_
type_ param_ bound - fold_
type_ paren - fold_
type_ path - fold_
type_ ptr - fold_
type_ reference - fold_
type_ slice - fold_
type_ trait_ object - fold_
type_ tuple - fold_
un_ op - fold_
use_ glob - fold_
use_ group - fold_
use_ name - fold_
use_ path - fold_
use_ rename - fold_
use_ tree - fold_
variadic - fold_
variant - fold_
vis_ restricted - fold_
visibility - fold_
where_ clause - fold_
where_ predicate