derive_more_impl/
deref.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 = State::with_field_ignore_and_forward(
9 input,
10 trait_name,
11 trait_name.to_lowercase(),
12 )?;
13 let SingleFieldData {
14 input_type,
15 field_type,
16 trait_path,
17 casted_trait,
18 ty_generics,
19 member,
20 info,
21 ..
22 } = state.assert_single_enabled_field();
23
24 let (target, body, generics) = if info.forward {
25 (
26 quote! { #casted_trait::Target },
27 quote! { #casted_trait::deref(&#member) },
28 add_extra_where_clauses(
29 &input.generics,
30 quote! {
31 where #field_type: #trait_path
32 },
33 ),
34 )
35 } else {
36 (
37 quote! { #field_type },
38 quote! { &#member },
39 input.generics.clone(),
40 )
41 };
42 let (impl_generics, _, where_clause) = generics.split_for_impl();
43
44 Ok(quote! {
45 #[automatically_derived]
46 impl #impl_generics #trait_path for #input_type #ty_generics #where_clause {
47 type Target = #target;
48
49 #[inline]
50 fn deref(&self) -> &Self::Target {
51 #body
52 }
53 }
54 })
55}