derive_more_impl/
add_helpers.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::{Field, Ident, Index};
4
5pub fn tuple_exprs(fields: &[&Field], method_ident: &Ident) -> Vec<TokenStream> {
6    let mut exprs = vec![];
7
8    for i in 0..fields.len() {
9        let i = Index::from(i);
10        // generates `self.0.add(rhs.0)`
11        let expr = quote! { self.#i.#method_ident(rhs.#i) };
12        exprs.push(expr);
13    }
14    exprs
15}
16
17pub fn struct_exprs(fields: &[&Field], method_ident: &Ident) -> Vec<TokenStream> {
18    let mut exprs = vec![];
19
20    for field in fields {
21        // It's safe to unwrap because struct fields always have an identifier
22        let field_id = field.ident.as_ref().unwrap();
23        // generates `x: self.x.add(rhs.x)`
24        let expr = quote! { self.#field_id.#method_ident(rhs.#field_id) };
25        exprs.push(expr)
26    }
27    exprs
28}