@@ -29,8 +29,8 @@ use syn::{
2929 parse:: { Parse , ParseStream } ,
3030 punctuated:: Punctuated ,
3131 spanned:: Spanned ,
32- DeriveInput , Ident , ImplGenerics , Meta , Path , Result , Token , TraitBound , TraitBoundModifier ,
33- TypeGenerics , TypeParamBound , WhereClause ,
32+ Attribute , DeriveInput , Ident , ImplGenerics , Meta , Path , Result , Token , TraitBound ,
33+ TraitBoundModifier , TypeGenerics , TypeParamBound , WhereClause ,
3434} ;
3535
3636use crate :: { util:: MetaListExt , Data , DeriveWhere , Error , Item , SplitGenerics } ;
@@ -148,10 +148,11 @@ impl Trait {
148148 /// Re-direct to [`TraitImpl::parse_derive_trait()`].
149149 pub fn parse_derive_trait (
150150 & self ,
151+ attrs : & [ Attribute ] ,
151152 span : Span ,
152- list : Punctuated < Meta , Token ! [ , ] > ,
153+ list : Option < Punctuated < Meta , Token ! [ , ] > > ,
153154 ) -> Result < DeriveTrait > {
154- trait_dispatch ! ( self , parse_derive_trait( span, list) )
155+ trait_dispatch ! ( self , parse_derive_trait( attrs , span, list) )
155156 }
156157
157158 /// Re-direct to [`TraitImpl::supports_union()`].
@@ -256,7 +257,12 @@ impl DeriveTrait {
256257 }
257258
258259 /// Create [`DeriveTrait`] from [`ParseStream`].
259- pub fn from_stream ( span : Span , data : & syn:: Data , input : ParseStream ) -> Result < ( Span , Self ) > {
260+ pub fn from_stream (
261+ attrs : & [ Attribute ] ,
262+ span : Span ,
263+ data : & syn:: Data ,
264+ input : ParseStream ,
265+ ) -> Result < ( Span , Self ) > {
260266 match Meta :: parse ( input) {
261267 Ok ( meta) => {
262268 let trait_ = Trait :: from_path ( meta. path ( ) ) ?;
@@ -269,12 +275,18 @@ impl DeriveTrait {
269275 }
270276
271277 match & meta {
272- Meta :: Path ( path) => Ok ( ( path. span ( ) , trait_. default_derive_trait ( ) ) ) ,
278+ Meta :: Path ( path) => Ok ( (
279+ path. span ( ) ,
280+ trait_. parse_derive_trait ( attrs, meta. span ( ) , None ) ?,
281+ ) ) ,
273282 Meta :: List ( list) => {
274283 let nested = list. parse_non_empty_nested_metas ( ) ?;
275284
276285 // This will return an error if no options are supported.
277- Ok ( ( list. span ( ) , trait_. parse_derive_trait ( meta. span ( ) , nested) ?) )
286+ Ok ( (
287+ list. span ( ) ,
288+ trait_. parse_derive_trait ( attrs, meta. span ( ) , Some ( nested) ) ?,
289+ ) )
278290 }
279291 Meta :: NameValue ( name_value) => Err ( Error :: option_syntax ( name_value. span ( ) ) ) ,
280292 }
@@ -299,11 +311,19 @@ pub trait TraitImpl: Deref<Target = Trait> {
299311 Self : Sized ;
300312
301313 /// Parse a `derive_where` trait with it's options.
302- fn parse_derive_trait ( span : Span , _list : Punctuated < Meta , Token ! [ , ] > ) -> Result < DeriveTrait >
314+ fn parse_derive_trait (
315+ _attrs : & [ Attribute ] ,
316+ span : Span ,
317+ list : Option < Punctuated < Meta , Token ! [ , ] > > ,
318+ ) -> Result < DeriveTrait >
303319 where
304320 Self : Sized ,
305321 {
306- Err ( Error :: options ( span, Self :: as_str ( ) ) )
322+ if list. is_some ( ) {
323+ Err ( Error :: options ( span, Self :: as_str ( ) ) )
324+ } else {
325+ Ok ( Self :: default_derive_trait ( ) )
326+ }
307327 }
308328
309329 /// Returns `true` if [`Trait`] supports unions.
0 commit comments