Module fold

Source
Available 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)),
    }
}

/* ... */

§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_abiderive or full
fold_angle_bracketed_generic_argumentsderive or full
fold_armfull
fold_assoc_constderive or full
fold_assoc_typederive or full
fold_attr_stylederive or full
fold_attributederive or full
fold_bare_fn_argderive or full
fold_bare_variadicderive or full
fold_bin_opderive or full
fold_blockfull
fold_bound_lifetimesderive or full
fold_captured_paramfull
fold_const_paramderive or full
fold_constraintderive or full
fold_dataderive
fold_data_enumderive
fold_data_structderive
fold_data_unionderive
fold_derive_inputderive
fold_exprderive or full
fold_expr_arrayfull
fold_expr_assignfull
fold_expr_asyncfull
fold_expr_awaitfull
fold_expr_binaryderive or full
fold_expr_blockfull
fold_expr_breakfull
fold_expr_callderive or full
fold_expr_castderive or full
fold_expr_closurefull
fold_expr_constfull
fold_expr_continuefull
fold_expr_fieldderive or full
fold_expr_for_loopfull
fold_expr_groupderive or full
fold_expr_iffull
fold_expr_indexderive or full
fold_expr_inferfull
fold_expr_letfull
fold_expr_litderive or full
fold_expr_loopfull
fold_expr_macroderive or full
fold_expr_matchfull
fold_expr_method_callderive or full
fold_expr_parenderive or full
fold_expr_pathderive or full
fold_expr_rangefull
fold_expr_raw_addrfull
fold_expr_referencederive or full
fold_expr_repeatfull
fold_expr_returnfull
fold_expr_structderive or full
fold_expr_tryfull
fold_expr_try_blockfull
fold_expr_tuplederive or full
fold_expr_unaryderive or full
fold_expr_unsafefull
fold_expr_whilefull
fold_expr_yieldfull
fold_fieldderive or full
fold_field_mutabilityderive or full
fold_field_patfull
fold_field_valuederive or full
fold_fieldsderive or full
fold_fields_namedderive or full
fold_fields_unnamedderive or full
fold_filefull
fold_fn_argfull
fold_foreign_itemfull
fold_foreign_item_fnfull
fold_foreign_item_macrofull
fold_foreign_item_staticfull
fold_foreign_item_typefull
fold_generic_argumentderive or full
fold_generic_paramderive or full
fold_genericsderive or full
fold_ident
fold_impl_itemfull
fold_impl_item_constfull
fold_impl_item_fnfull
fold_impl_item_macrofull
fold_impl_item_typefull
fold_impl_restrictionfull
fold_indexderive or full
fold_itemfull
fold_item_constfull
fold_item_enumfull
fold_item_extern_cratefull
fold_item_fnfull
fold_item_foreign_modfull
fold_item_implfull
fold_item_macrofull
fold_item_modfull
fold_item_staticfull
fold_item_structfull
fold_item_traitfull
fold_item_trait_aliasfull
fold_item_typefull
fold_item_unionfull
fold_item_usefull
fold_labelfull
fold_lifetime
fold_lifetime_paramderive or full
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_localfull
fold_local_initfull
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_parenthesized_generic_argumentsderive or full
fold_patfull
fold_pat_identfull
fold_pat_orfull
fold_pat_parenfull
fold_pat_referencefull
fold_pat_restfull
fold_pat_slicefull
fold_pat_structfull
fold_pat_tuplefull
fold_pat_tuple_structfull
fold_pat_typefull
fold_pat_wildfull
fold_pathderive or full
fold_path_argumentsderive or full
fold_path_segmentderive or full
fold_pointer_mutabilityfull
fold_precise_capturefull
fold_predicate_lifetimederive or full
fold_predicate_typederive or full
fold_qselfderive or full
fold_range_limitsfull
fold_receiverfull
fold_return_typederive or full
fold_signaturefull
fold_span
fold_static_mutabilityfull
fold_stmtfull
fold_stmt_macrofull
fold_trait_boundderive or full
fold_trait_bound_modifierderive or full
fold_trait_itemfull
fold_trait_item_constfull
fold_trait_item_fnfull
fold_trait_item_macrofull
fold_trait_item_typefull
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_trait_objectderive or full
fold_type_tuplederive or full
fold_un_opderive or full
fold_use_globfull
fold_use_groupfull
fold_use_namefull
fold_use_pathfull
fold_use_renamefull
fold_use_treefull
fold_variadicfull
fold_variantderive or full
fold_vis_restrictedderive or full
fold_visibilityderive or full
fold_where_clausederive or full
fold_where_predicatederive or full