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