2 add_where_clauses_for_new_ident
, AttrParams
, MultiFieldData
, State
,
4 use proc_macro2
::{Span, TokenStream}
;
6 use syn
::{parse::Result, DeriveInput, Ident}
;
8 pub fn expand(input
: &DeriveInput
, trait_name
: &'
static str) -> Result
<TokenStream
> {
9 let as_ref_type
= &Ident
::new("__AsRefT", Span
::call_site());
10 let state
= State
::with_type_bound(
13 quote
!(::core
::convert
),
14 String
::from("as_ref"),
15 AttrParams
::ignore_and_forward(),
28 } = state
.enabled_fields_data();
29 let sub_items
: Vec
<_
> = infos
33 .map(|((info
, member
), field
)| {
34 let field_type
= &field
.ty
;
36 let trait_path
= quote
!(#trait_path<#as_ref_type>);
37 let type_where_clauses
= quote
! {
38 where #field_type: #trait_path
40 let new_generics
= add_where_clauses_for_new_ident(
47 let (impl_generics
, _
, where_clause
) = new_generics
.split_for_impl();
48 let casted_trait
= quote
!(<#field_type as #trait_path>);
50 quote
!(#casted_trait::as_ref(&#member)),
51 quote
!(#impl_generics),
52 quote
!(#where_clause),
59 quote
!(#impl_generics),
60 quote
!(#where_clause),
61 quote
!(#trait_path<#field_type>),
67 let bodies
= sub_items
.iter().map(|i
| &i
.0);
68 let impl_generics
= sub_items
.iter().map(|i
| &i
.1);
69 let where_clauses
= sub_items
.iter().map(|i
| &i
.2);
70 let trait_paths
= sub_items
.iter().map(|i
| &i
.3);
71 let return_types
= sub_items
.iter().map(|i
| &i
.4);
74 impl#impl_generics #trait_paths for #input_type#ty_generics
78 fn as_ref(&self) -> &#return_types {