@@ -4,13 +4,13 @@ mod field;
44mod fields;
55
66use proc_macro2:: Span ;
7- use syn:: { FieldsNamed , Ident , Pat , PatPath , Path , Result } ;
7+ use syn:: { FieldsNamed , Ident , Pat , PatPath , Path , Result , Variant } ;
88
99pub use self :: {
1010 field:: { Field , Member } ,
1111 fields:: Fields ,
1212} ;
13- use crate :: { util, Default , DeriveWhere , Either , Error , Skip , Trait } ;
13+ use crate :: { util, Default , DeriveWhere , Either , Error , Skip , Trait , VariantAttr } ;
1414
1515/// Holds all relevant data of a struct, union or variant.
1616#[ cfg_attr( test, derive( Debug ) ) ]
@@ -141,20 +141,23 @@ impl<'a> Data<'a> {
141141 pub fn from_variant (
142142 item_ident : & ' a Ident ,
143143 derive_wheres : & [ DeriveWhere ] ,
144- skip_inner : Skip ,
145- default : Default ,
146- variant_ident : & ' a Ident ,
147- fields : & ' a syn:: Fields ,
144+ variant : & ' a Variant ,
148145 ) -> Result < Self > {
149- let path = util:: path_from_idents ( & [ item_ident, variant_ident] ) ;
146+ // Parse `Attribute`s on variant.
147+ let VariantAttr {
148+ default,
149+ skip_inner,
150+ } = VariantAttr :: from_attrs ( & variant. attrs , derive_wheres, variant) ?;
150151
151- match fields {
152+ let path = util:: path_from_idents ( & [ item_ident, & variant. ident ] ) ;
153+
154+ match & variant. fields {
152155 syn:: Fields :: Named ( fields) => {
153156 let fields = Fields :: from_named ( derive_wheres, & skip_inner, path. clone ( ) , fields) ?;
154157
155158 Ok ( Self {
156159 skip_inner,
157- ident : variant_ident ,
160+ ident : & variant . ident ,
158161 path,
159162 type_ : DataType :: Variant {
160163 default,
@@ -168,7 +171,7 @@ impl<'a> Data<'a> {
168171
169172 Ok ( Self {
170173 skip_inner,
171- ident : variant_ident ,
174+ ident : & variant . ident ,
172175 path,
173176 type_ : DataType :: Variant {
174177 default,
@@ -185,7 +188,7 @@ impl<'a> Data<'a> {
185188
186189 Ok ( Self {
187190 skip_inner,
188- ident : variant_ident ,
191+ ident : & variant . ident ,
189192 path,
190193 type_ : DataType :: Variant {
191194 default,
@@ -239,11 +242,20 @@ impl<'a> Data<'a> {
239242 /// not a variant, always returns `true`.
240243 pub fn is_default ( & self ) -> bool {
241244 match self . type_ {
242- DataType :: Variant { default, .. } => default. 0 ,
245+ DataType :: Variant { default, .. } => default. 0 . is_some ( ) ,
243246 _ => true ,
244247 }
245248 }
246249
250+ /// Returns [`Some`] if this variant has a [`struct@Default`]. If
251+ /// not a variant, always returns [`None`].
252+ pub fn default_span ( & self ) -> Option < Span > {
253+ match & self . type_ {
254+ DataType :: Variant { default, .. } => default. 0 ,
255+ _ => None ,
256+ }
257+ }
258+
247259 /// Returns `true` if this [`Data`] has no [`Fields`].
248260 pub fn is_empty ( & self , trait_ : & Trait ) -> bool {
249261 self . iter_fields ( trait_) . count ( ) == 0
0 commit comments