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_abiderive or full
fold_attr_stylederive or full
fold_attributederive or full
fold_bare_fn_argderive or full
fold_bin_opderive or full
fold_bindingderive or full
fold_bound_lifetimesderive or full
fold_const_paramderive or full
fold_constraintderive or full
fold_dataderive
fold_exprderive or full
fold_expr_binaryderive or full
fold_expr_callderive or full
fold_expr_castderive or full
fold_expr_fieldderive or full
fold_expr_indexderive or full
fold_expr_litderive or full
fold_expr_parenderive or full
fold_expr_pathderive or full
fold_expr_unaryderive or full
fold_fieldderive or full
fold_fieldsderive or full
fold_fields_namedderive or full
fold_fields_unnamedderive or full
fold_generic_argumentderive or full
fold_generic_paramderive or full
fold_genericsderive or full
fold_indexderive or full
fold_lifetime_defderive or full
fold_macroderive or full
fold_macro_delimiterderive or full
fold_memberderive or full
fold_metaderive or full
fold_meta_listderive or full
fold_meta_name_valuederive or full
fold_nested_metaderive or full
fold_pathderive or full
fold_path_argumentsderive or full
fold_path_segmentderive or full
fold_predicate_eqderive or full
fold_predicate_typederive or full
fold_qselfderive or full
fold_return_typederive or full
fold_trait_boundderive or full
fold_typederive or full
fold_type_arrayderive or full
fold_type_bare_fnderive or full
fold_type_groupderive or full
fold_type_impl_traitderive or full
fold_type_inferderive or full
fold_type_macroderive or full
fold_type_neverderive or full
fold_type_paramderive or full
fold_type_param_boundderive or full
fold_type_parenderive or full
fold_type_pathderive or full
fold_type_ptrderive or full
fold_type_referencederive or full
fold_type_slicederive or full
fold_type_tuplederive or full
fold_un_opderive or full
fold_variadicderive or full
fold_variantderive or full
fold_vis_cratederive or full
fold_vis_publicderive or full
fold_vis_restrictedderive or full
fold_visibilityderive or full
fold_where_clausederive or full
fold_where_predicatederive or full