cgp_component_macro_lib/derive_component/
replace_self_receiver.rs

1use proc_macro2::Ident;
2use syn::{parse_quote, FnArg, TraitItemFn};
3
4use crate::derive_component::snake_case::to_snake_case_ident;
5
6pub fn replace_self_receiver(func: &mut TraitItemFn, replaced_type: &Ident) {
7    if let Some(arg) = func.sig.inputs.first_mut() {
8        if let FnArg::Receiver(receiver) = arg {
9            let replaced_var = to_snake_case_ident(replaced_type);
10
11            match (&receiver.reference, &receiver.mutability) {
12                (None, None) => {
13                    *arg = parse_quote!(#replaced_var : #replaced_type);
14                }
15                (Some((_and, None)), None) => {
16                    *arg = parse_quote!(#replaced_var : & #replaced_type);
17                }
18                (Some((_and, Some(life))), None) => {
19                    *arg = parse_quote!(#replaced_var : & #life #replaced_type);
20                }
21                (Some((_and, None)), Some(_mut)) => {
22                    *arg = parse_quote!(#replaced_var : &mut #replaced_type);
23                }
24                (Some((_and, Some(life))), Some(_mut)) => {
25                    *arg = parse_quote!(#replaced_var : & #life mut #replaced_type);
26                }
27                _ => {}
28            }
29        }
30    }
31}