@@ -104,7 +104,7 @@ pub struct DeriveWhere {
104104 /// Save [`Span`] for error messages.
105105 pub span : Span ,
106106 /// [traits](DeriveTrait) to implement.
107- pub traits : Vec < DeriveTrait > ,
107+ pub traits : Vec < DeriveTraitWrapper > ,
108108 /// [generics](Generic) for where clause.
109109 pub generics : Vec < Generic > ,
110110}
@@ -125,7 +125,7 @@ impl DeriveWhere {
125125 // Start with parsing a trait.
126126 // Not checking for duplicates here, because these should produce a Rust error
127127 // anyway.
128- traits. push ( DeriveTrait :: from_stream ( span, data, input) ?) ;
128+ traits. push ( DeriveTraitWrapper :: from_stream ( span, data, input) ?) ;
129129
130130 if !input. is_empty ( ) {
131131 let mut fork = input. fork ( ) ;
@@ -178,7 +178,8 @@ impl DeriveWhere {
178178 pub fn trait_ ( & self , trait_ : & Trait ) -> Option < & DeriveTrait > {
179179 self . traits
180180 . iter ( )
181- . find ( |derive_trait| & * * * derive_trait == trait_)
181+ . map ( |wrapper| & wrapper. trait_ )
182+ . find ( |derive_trait| derive_trait == trait_)
182183 }
183184
184185 /// Returns `true` if any [`CustomBound`](Generic::CustomBound) is present.
@@ -275,6 +276,14 @@ impl Parse for Generic {
275276 }
276277}
277278
279+ /// Wrapper around [`DeriveTrait`] to add [`Span`].
280+ pub struct DeriveTraitWrapper {
281+ /// [`Span`] for error messages.
282+ pub span : Span ,
283+ /// Trait in this wrapper.
284+ trait_ : DeriveTrait ,
285+ }
286+
278287/// Trait to implement.
279288pub enum DeriveTrait {
280289 /// [`Clone`].
@@ -305,6 +314,14 @@ pub enum DeriveTrait {
305314 } ,
306315}
307316
317+ impl Deref for DeriveTraitWrapper {
318+ type Target = DeriveTrait ;
319+
320+ fn deref ( & self ) -> & Self :: Target {
321+ & self . trait_
322+ }
323+ }
324+
308325impl Deref for DeriveTrait {
309326 type Target = Trait ;
310327
@@ -327,7 +344,21 @@ impl Deref for DeriveTrait {
327344 }
328345}
329346
330- impl DeriveTrait {
347+ impl PartialEq < Trait > for & DeriveTraitWrapper {
348+ fn eq ( & self , other : & Trait ) -> bool {
349+ let trait_: & DeriveTrait = self ;
350+ trait_ == * other
351+ }
352+ }
353+
354+ impl PartialEq < Trait > for & DeriveTrait {
355+ fn eq ( & self , other : & Trait ) -> bool {
356+ let trait_: & Trait = self ;
357+ trait_ == other
358+ }
359+ }
360+
361+ impl DeriveTraitWrapper {
331362 /// Create [`DeriveTrait`] from [`ParseStream`].
332363 fn from_stream ( span : Span , data : & Data , input : ParseStream ) -> Result < Self > {
333364 match Meta :: parse ( input) {
@@ -342,23 +373,31 @@ impl DeriveTrait {
342373 }
343374
344375 match meta {
345- Meta :: Path ( _) => Ok ( trait_. default_derive_trait ( ) ) ,
376+ Meta :: Path ( path) => Ok ( Self {
377+ span : path. span ( ) ,
378+ trait_ : trait_. default_derive_trait ( ) ,
379+ } ) ,
346380 Meta :: List ( list) => {
347381 if list. nested . is_empty ( ) {
348382 return Err ( Error :: option_empty ( list. span ( ) ) ) ;
349383 }
350384
351- // This will return an error if no options are supported.
352- trait_. parse_derive_trait ( list)
385+ Ok ( Self {
386+ span : list. span ( ) ,
387+ // This will return an error if no options are supported.
388+ trait_ : trait_. parse_derive_trait ( list) ?,
389+ } )
353390 }
354391 Meta :: NameValue ( name_value) => Err ( Error :: option_syntax ( name_value. span ( ) ) ) ,
355392 }
356393 }
357394 Err ( error) => Err ( Error :: trait_syntax ( error. span ( ) ) ) ,
358395 }
359396 }
397+ }
360398
361- /// Returns fully qualified path for this trait.
399+ impl DeriveTrait {
400+ /// Returns fully qualified [`Path`] for this trait.
362401 pub fn path ( & self ) -> Path {
363402 use DeriveTrait :: * ;
364403
0 commit comments