derive_more_impl/
deref_mut.rs1use crate::utils::{add_extra_where_clauses, SingleFieldData, State};
2use proc_macro2::TokenStream;
3use quote::quote;
4use syn::{parse::Result, DeriveInput};
5
6pub fn expand(input: &DeriveInput, trait_name: &'static str) -> Result<TokenStream> {
8 let state =
9 State::with_field_ignore_and_forward(input, trait_name, "deref_mut".into())?;
10 let SingleFieldData {
11 input_type,
12 trait_path,
13 casted_trait,
14 ty_generics,
15 field_type,
16 member,
17 info,
18 ..
19 } = state.assert_single_enabled_field();
20 let (body, generics) = if info.forward {
21 (
22 quote! { #casted_trait::deref_mut(&mut #member) },
23 add_extra_where_clauses(
24 &input.generics,
25 quote! {
26 where #field_type: #trait_path
27 },
28 ),
29 )
30 } else {
31 (quote! { &mut #member }, input.generics.clone())
32 };
33 let (impl_generics, _, where_clause) = generics.split_for_impl();
34
35 Ok(quote! {
36 #[automatically_derived]
37 impl #impl_generics #trait_path for #input_type #ty_generics #where_clause {
38 #[inline]
39 fn deref_mut(&mut self) -> &mut Self::Target {
40 #body
41 }
42 }
43 })
44}