@@ -27,132 +27,134 @@ pub fn derive_default_no_bound(input: proc_macro::TokenStream) -> proc_macro::To
2727
2828 let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
2929
30- let impl_ =
31- match input. data {
32- Data :: Struct ( struct_) => match struct_. fields {
33- Fields :: Named ( named) => {
34- let fields = named. named . iter ( ) . map ( |field| & field. ident ) . map ( |ident| {
35- quote_spanned ! { ident. span( ) =>
36- #ident: :: core:: default :: Default :: default ( )
37- }
38- } ) ;
30+ let impl_ = match input. data {
31+ Data :: Struct ( struct_) => match struct_. fields {
32+ Fields :: Named ( named) => {
33+ let fields = named. named . iter ( ) . map ( |field| & field. ident ) . map ( |ident| {
34+ quote_spanned ! { ident. span( ) =>
35+ #ident: :: core:: default :: Default :: default ( )
36+ }
37+ } ) ;
38+
39+ quote ! ( Self { #( #fields, ) * } )
40+ }
41+ Fields :: Unnamed ( unnamed) => {
42+ let fields = unnamed. unnamed . iter ( ) . map ( |field| {
43+ quote_spanned ! { field. span( ) =>
44+ :: core:: default :: Default :: default ( )
45+ }
46+ } ) ;
47+
48+ quote ! ( Self ( #( #fields, ) * ) )
49+ }
50+ Fields :: Unit => {
51+ quote ! ( Self )
52+ }
53+ } ,
54+ Data :: Enum ( enum_) => {
55+ if enum_. variants . is_empty ( ) {
56+ return syn:: Error :: new_spanned ( name, "cannot derive Default for an empty enum" )
57+ . to_compile_error ( )
58+ . into ( ) ;
59+ }
3960
40- quote ! ( Self { #( #fields, ) * } )
41- }
42- Fields :: Unnamed ( unnamed) => {
43- let fields = unnamed. unnamed . iter ( ) . map ( |field| {
44- quote_spanned ! { field. span( ) =>
45- :: core:: default :: Default :: default ( )
61+ // all #[default] attrs with the variant they're on; i.e. a var
62+ let default_variants = enum_
63+ . variants
64+ . into_iter ( )
65+ . filter ( |variant| {
66+ variant
67+ . attrs
68+ . iter ( )
69+ . any ( |attr| attr. path ( ) . is_ident ( "default" ) )
70+ } )
71+ . collect :: < Vec < _ > > ( ) ;
72+
73+ match & * default_variants {
74+ [ ] => return syn:: Error :: new (
75+ name. clone ( ) . span ( ) ,
76+ "no default declared, make a variant default by placing `#[default]` above it" ,
77+ )
78+ . into_compile_error ( )
79+ . into ( ) ,
80+ // only one variant with the #[default] attribute set
81+ [ default_variant] => {
82+ let variant_attrs = default_variant
83+ . attrs
84+ . iter ( )
85+ . filter ( |a| a. path ( ) . is_ident ( "default" ) )
86+ . collect :: < Vec < _ > > ( ) ;
87+
88+ // check that there is only one #[default] attribute on the variant
89+ if let [ first_attr, second_attr, additional_attrs @ ..] = & * variant_attrs {
90+ let mut err =
91+ syn:: Error :: new ( Span :: call_site ( ) , "multiple `#[default]` attributes" ) ;
92+
93+ err. combine ( syn:: Error :: new_spanned (
94+ first_attr,
95+ "`#[default]` used here" ,
96+ ) ) ;
97+
98+ err. extend ( [ second_attr] . into_iter ( ) . chain ( additional_attrs) . map (
99+ |variant| {
100+ syn:: Error :: new_spanned ( variant, "`#[default]` used again here" )
101+ } ,
102+ ) ) ;
103+
104+ return err. into_compile_error ( ) . into ( ) ;
105+ }
106+
107+ let variant_ident = & default_variant. ident ;
108+
109+ let fully_qualified_variant_path = quote ! ( Self :: #variant_ident) ;
110+
111+ match & default_variant. fields {
112+ Fields :: Named ( named) => {
113+ let fields =
114+ named. named . iter ( ) . map ( |field| & field. ident ) . map ( |ident| {
115+ quote_spanned ! { ident. span( ) =>
116+ #ident: :: core:: default :: Default :: default ( )
117+ }
118+ } ) ;
119+
120+ quote ! ( #fully_qualified_variant_path { #( #fields, ) * } )
46121 }
47- } ) ;
48-
49- quote ! ( Self ( #( #fields, ) * ) )
50- }
51- Fields :: Unit => {
52- quote ! ( Self )
53- }
54- } ,
55- Data :: Enum ( enum_) => {
56- if enum_. variants . is_empty ( ) {
57- return syn:: Error :: new_spanned ( name, "cannot derive Default for an empty enum" )
58- . to_compile_error ( )
59- . into ( ) ;
122+ Fields :: Unnamed ( unnamed) => {
123+ let fields = unnamed. unnamed . iter ( ) . map ( |field| {
124+ quote_spanned ! { field. span( ) =>
125+ :: core:: default :: Default :: default ( )
126+ }
127+ } ) ;
128+
129+ quote ! ( #fully_qualified_variant_path( #( #fields, ) * ) )
130+ }
131+ Fields :: Unit => fully_qualified_variant_path,
132+ }
60133 }
134+ [ first, additional @ ..] => {
135+ let mut err = syn:: Error :: new ( Span :: call_site ( ) , "multiple declared defaults" ) ;
61136
62- // all #[default] attrs with the variant they're on; i.e. a var
63- let default_variants = enum_
64- . variants
65- . into_iter ( )
66- . filter ( |variant| {
67- variant
68- . attrs
69- . iter ( )
70- . any ( |attr| attr. path ( ) . is_ident ( "default" ) )
71- } )
72- . collect :: < Vec < _ > > ( ) ;
73-
74- match & * default_variants {
75- [ ] => return syn:: Error :: new (
76- name. clone ( ) . span ( ) ,
77- "no default declared, make a variant default by placing `#[default]` above it" ,
78- )
79- . into_compile_error ( )
80- . into ( ) ,
81- // only one variant with the #[default] attribute set
82- [ default_variant] => {
83- let variant_attrs = default_variant
84- . attrs
85- . iter ( )
86- . filter ( |a| a. path ( ) . is_ident ( "default" ) )
87- . collect :: < Vec < _ > > ( ) ;
88-
89- // check that there is only one #[default] attribute on the variant
90- if let [ first_attr, second_attr, additional_attrs @ ..] = & * variant_attrs {
91- let mut err =
92- syn:: Error :: new ( Span :: call_site ( ) , "multiple `#[default]` attributes" ) ;
93-
94- err. combine ( syn:: Error :: new_spanned ( first_attr, "`#[default]` used here" ) ) ;
95-
96- err. extend ( [ second_attr] . into_iter ( ) . chain ( additional_attrs) . map (
97- |variant| {
98- syn:: Error :: new_spanned ( variant, "`#[default]` used again here" )
99- } ,
100- ) ) ;
101-
102- return err. into_compile_error ( ) . into ( )
103- }
104-
105- let variant_ident = & default_variant. ident ;
106-
107- let fully_qualified_variant_path = quote ! ( Self :: #variant_ident) ;
108-
109- match & default_variant. fields {
110- Fields :: Named ( named) => {
111- let fields =
112- named. named . iter ( ) . map ( |field| & field. ident ) . map ( |ident| {
113- quote_spanned ! { ident. span( ) =>
114- #ident: :: core:: default :: Default :: default ( )
115- }
116- } ) ;
117-
118- quote ! ( #fully_qualified_variant_path { #( #fields, ) * } )
119- } ,
120- Fields :: Unnamed ( unnamed) => {
121- let fields = unnamed. unnamed . iter ( ) . map ( |field| {
122- quote_spanned ! { field. span( ) =>
123- :: core:: default :: Default :: default ( )
124- }
125- } ) ;
126-
127- quote ! ( #fully_qualified_variant_path( #( #fields, ) * ) )
128- } ,
129- Fields :: Unit => fully_qualified_variant_path,
130- }
131- } ,
132- [ first, additional @ ..] => {
133- let mut err = syn:: Error :: new ( Span :: call_site ( ) , "multiple declared defaults" ) ;
134-
135- err. combine ( syn:: Error :: new_spanned ( first, "first default" ) ) ;
136-
137- err. extend (
138- additional
139- . into_iter ( )
140- . map ( |variant| syn:: Error :: new_spanned ( variant, "additional default" ) ) ,
141- ) ;
142-
143- return err. into_compile_error ( ) . into ( )
144- } ,
145- }
146- }
147- Data :: Union ( union_) => {
148- return syn:: Error :: new_spanned (
149- union_. union_token ,
150- "Union type not supported by `derive(DefaultNoBound)`" ,
151- )
152- . to_compile_error ( )
153- . into ( )
137+ err. combine ( syn:: Error :: new_spanned ( first, "first default" ) ) ;
138+
139+ err. extend (
140+ additional
141+ . into_iter ( )
142+ . map ( |variant| syn:: Error :: new_spanned ( variant, "additional default" ) ) ,
143+ ) ;
144+
145+ return err. into_compile_error ( ) . into ( ) ;
146+ }
154147 }
155- } ;
148+ }
149+ Data :: Union ( union_) => {
150+ return syn:: Error :: new_spanned (
151+ union_. union_token ,
152+ "Union type not supported by `derive(DefaultNoBound)`" ,
153+ )
154+ . to_compile_error ( )
155+ . into ( )
156+ }
157+ } ;
156158
157159 quote ! (
158160 const _: ( ) = {
0 commit comments