@@ -4,38 +4,46 @@ use quote::{format_ident, quote};
4
4
use syn:: { Data , DataEnum , DataStruct , DeriveInput , Error , Fields , Result } ;
5
5
6
6
pub fn derive ( input : & DeriveInput ) -> Result < TokenStream > {
7
- match & input. data {
7
+ let impls = match & input. data {
8
8
Data :: Struct ( data) => impl_struct ( input, data) ,
9
9
Data :: Enum ( data) => impl_enum ( input, data) ,
10
10
Data :: Union ( _) => Err ( Error :: new_spanned ( input, "Unions are not supported" ) ) ,
11
- }
11
+ } ?;
12
+
13
+ let helpers = specialization ( ) ;
14
+ Ok ( quote ! {
15
+ const _: ( ) = {
16
+ #helpers
17
+ #impls
18
+ } ;
19
+ } )
12
20
}
13
21
14
22
#[ cfg( feature = "std" ) ]
15
23
fn specialization ( ) -> TokenStream {
16
24
quote ! {
17
25
trait DisplayToDisplayDoc {
18
- fn get_display ( & self ) -> Self ;
26
+ fn __displaydoc_display ( & self ) -> & Self ;
19
27
}
20
28
21
- impl <T : core:: fmt:: Display > DisplayToDisplayDoc for & T {
22
- fn get_display ( & self ) -> Self {
29
+ impl <T : core:: fmt:: Display > DisplayToDisplayDoc for T {
30
+ fn __displaydoc_display ( & self ) -> & Self {
23
31
self
24
32
}
25
33
}
26
34
27
35
trait PathToDisplayDoc {
28
- fn get_display ( & self ) -> std:: path:: Display <' _>;
36
+ fn __displaydoc_display ( & self ) -> std:: path:: Display <' _>;
29
37
}
30
38
31
39
impl PathToDisplayDoc for std:: path:: Path {
32
- fn get_display ( & self ) -> std:: path:: Display <' _> {
40
+ fn __displaydoc_display ( & self ) -> std:: path:: Display <' _> {
33
41
self . display( )
34
42
}
35
43
}
36
44
37
45
impl PathToDisplayDoc for std:: path:: PathBuf {
38
- fn get_display ( & self ) -> std:: path:: Display <' _> {
46
+ fn __displaydoc_display ( & self ) -> std:: path:: Display <' _> {
39
47
self . display( )
40
48
}
41
49
}
@@ -74,13 +82,7 @@ fn impl_struct(input: &DeriveInput, data: &DataStruct) -> Result<TokenStream> {
74
82
}
75
83
} ) ;
76
84
77
- let needed_traits = specialization ( ) ;
78
-
79
- Ok ( quote ! {
80
- #needed_traits
81
-
82
- #display
83
- } )
85
+ Ok ( quote ! { #display } )
84
86
}
85
87
86
88
fn impl_enum ( input : & DeriveInput , data : & DataEnum ) -> Result < TokenStream > {
@@ -93,7 +95,7 @@ fn impl_enum(input: &DeriveInput, data: &DataEnum) -> Result<TokenStream> {
93
95
. map ( |variant| attr:: display ( & variant. attrs ) )
94
96
. collect :: < Result < Vec < _ > > > ( ) ?;
95
97
96
- let display = if displays. iter ( ) . any ( Option :: is_some) {
98
+ if displays. iter ( ) . any ( Option :: is_some) {
97
99
let arms = data
98
100
. variants
99
101
. iter ( )
@@ -115,7 +117,7 @@ fn impl_enum(input: &DeriveInput, data: &DataEnum) -> Result<TokenStream> {
115
117
} )
116
118
} )
117
119
. collect :: < Result < Vec < _ > > > ( ) ?;
118
- Some ( quote ! {
120
+ Ok ( quote ! {
119
121
impl #impl_generics core:: fmt:: Display for #ty #ty_generics #where_clause {
120
122
fn fmt( & self , formatter: & mut core:: fmt:: Formatter ) -> core:: fmt:: Result {
121
123
#[ allow( unused_variables) ]
@@ -126,14 +128,6 @@ fn impl_enum(input: &DeriveInput, data: &DataEnum) -> Result<TokenStream> {
126
128
}
127
129
} )
128
130
} else {
129
- return Err ( Error :: new_spanned ( input, "Missing doc comments" ) ) ;
130
- } ;
131
-
132
- let needed_traits = specialization ( ) ;
133
-
134
- Ok ( quote ! {
135
- #needed_traits
136
-
137
- #display
138
- } )
131
+ Err ( Error :: new_spanned ( input, "Missing doc comments" ) )
132
+ }
139
133
}
0 commit comments