Module syn::fold [−][src]
This is supported on crate feature
fold
only.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)),
}
}
/* ... */
This module is available only if Syn is built with the "fold"
feature.
Example
This fold inserts parentheses to fully parenthesizes any expression.
// [dependencies]
// quote = "1.0"
// syn = { version = "1.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
Syntax tree traversal to transform the nodes of an owned syntax tree.
Functions
fold_abi
derive
or full
fold_angle_bracketed_generic_arguments
derive
or full
fold_arm
full
fold_attr_style
derive
or full
fold_attribute
derive
or full
fold_bare_fn_arg
derive
or full
fold_bin_op
derive
or full
fold_binding
derive
or full
fold_block
full
fold_bound_lifetimes
derive
or full
fold_const_param
derive
or full
fold_constraint
derive
or full
fold_data
derive
fold_data_enum
derive
fold_data_struct
derive
fold_data_union
derive
fold_derive_input
derive
fold_expr
derive
or full
fold_expr_array
full
fold_expr_assign
full
fold_expr_async
full
fold_expr_await
full
fold_expr_binary
derive
or full
fold_expr_block
full
fold_expr_box
full
fold_expr_break
full
fold_expr_call
derive
or full
fold_expr_cast
derive
or full
fold_expr_field
derive
or full
fold_expr_group
full
fold_expr_if
full
fold_expr_index
derive
or full
fold_expr_let
full
fold_expr_lit
derive
or full
fold_expr_loop
full
fold_expr_macro
full
fold_expr_match
full
fold_expr_paren
derive
or full
fold_expr_path
derive
or full
fold_expr_range
full
fold_expr_repeat
full
fold_expr_return
full
fold_expr_struct
full
fold_expr_try
full
fold_expr_tuple
full
fold_expr_type
full
fold_expr_unary
derive
or full
fold_expr_unsafe
full
fold_expr_while
full
fold_expr_yield
full
fold_field
derive
or full
fold_field_pat
full
fold_field_value
full
fold_fields
derive
or full
fold_fields_named
derive
or full
fold_fields_unnamed
derive
or full
fold_file
full
fold_fn_arg
full
fold_generic_argument
derive
or full
fold_generic_param
derive
or full
fold_generics
derive
or full
fold_impl_item
full
fold_index
derive
or full
fold_item
full
fold_item_const
full
fold_item_enum
full
fold_item_fn
full
fold_item_impl
full
fold_item_macro
full
fold_item_macro2
full
fold_item_mod
full
fold_item_static
full
fold_item_struct
full
fold_item_trait
full
fold_item_type
full
fold_item_union
full
fold_item_use
full
fold_label
full
fold_lifetime_def
derive
or full
fold_local
full
fold_macro
derive
or full
fold_macro_delimiter
derive
or full
fold_member
derive
or full
fold_meta
derive
or full
fold_meta_list
derive
or full
fold_meta_name_value
derive
or full
fold_nested_meta
derive
or full
fold_parenthesized_generic_arguments
derive
or full
fold_pat
full
fold_pat_box
full
fold_pat_ident
full
fold_pat_lit
full
fold_pat_macro
full
fold_pat_or
full
fold_pat_path
full
fold_pat_range
full
fold_pat_rest
full
fold_pat_slice
full
fold_pat_struct
full
fold_pat_tuple
full
fold_pat_type
full
fold_pat_wild
full
fold_path
derive
or full
fold_path_arguments
derive
or full
fold_path_segment
derive
or full
fold_predicate_eq
derive
or full
fold_predicate_lifetime
derive
or full
fold_predicate_type
derive
or full
fold_qself
derive
or full
fold_receiver
full
fold_return_type
derive
or full
fold_signature
full
fold_stmt
full
fold_trait_bound
derive
or full
fold_trait_bound_modifier
derive
or full
fold_trait_item
full
fold_type
derive
or full
fold_type_array
derive
or full
fold_type_bare_fn
derive
or full
fold_type_group
derive
or full
fold_type_impl_trait
derive
or full
fold_type_infer
derive
or full
fold_type_macro
derive
or full
fold_type_never
derive
or full
fold_type_param
derive
or full
fold_type_param_bound
derive
or full
fold_type_paren
derive
or full
fold_type_path
derive
or full
fold_type_ptr
derive
or full
fold_type_reference
derive
or full
fold_type_slice
derive
or full
fold_type_trait_object
derive
or full
fold_type_tuple
derive
or full
fold_un_op
derive
or full
fold_use_glob
full
fold_use_group
full
fold_use_name
full
fold_use_path
full
fold_use_rename
full
fold_use_tree
full
fold_variadic
derive
or full
fold_variant
derive
or full
fold_vis_crate
derive
or full
fold_vis_public
derive
or full
fold_vis_restricted
derive
or full
fold_visibility
derive
or full
fold_where_clause
derive
or full
fold_where_predicate
derive
or full