derive_more_impl/
mul_assign_like.rs

1use crate::add_assign_like;
2use crate::mul_helpers::generics_and_exprs;
3use crate::utils::{AttrParams, HashSet, MultiFieldData, RefType, State};
4use proc_macro2::TokenStream;
5use quote::{format_ident, quote};
6use std::iter;
7use syn::{DeriveInput, Result};
8
9pub fn expand(input: &DeriveInput, trait_name: &'static str) -> Result<TokenStream> {
10    let method_name = trait_name
11        .to_lowercase()
12        .trim_end_matches("assign")
13        .to_string()
14        + "_assign";
15
16    let mut state = State::with_attr_params(
17        input,
18        trait_name,
19        method_name,
20        AttrParams::struct_(vec!["forward"]),
21    )?;
22    if state.default_info.forward {
23        return Ok(add_assign_like::expand(input, trait_name));
24    }
25    let scalar_ident = format_ident!("__RhsT");
26    state.add_trait_path_type_param(quote! { #scalar_ident });
27    let multi_field_data = state.enabled_fields_data();
28    let MultiFieldData {
29        input_type,
30        field_types,
31        ty_generics,
32        trait_path,
33        trait_path_with_params,
34        method_ident,
35        ..
36    } = multi_field_data.clone();
37
38    let tys = field_types.iter().collect::<HashSet<_>>();
39    let tys = tys.iter();
40    let trait_path_iter = iter::repeat(trait_path_with_params);
41
42    let type_where_clauses = quote! {
43        where #(#tys: #trait_path_iter),*
44    };
45
46    let (generics, exprs) = generics_and_exprs(
47        multi_field_data.clone(),
48        &scalar_ident,
49        type_where_clauses,
50        RefType::Mut,
51    );
52    let (impl_generics, _, where_clause) = generics.split_for_impl();
53
54    Ok(quote! {
55        #[automatically_derived]
56        impl #impl_generics #trait_path<#scalar_ident> for #input_type #ty_generics #where_clause {
57            #[inline]
58            #[track_caller]
59            fn #method_ident(&mut self, rhs: #scalar_ident) {
60                #( #exprs; )*
61            }
62        }
63    })
64}