@@ -4,7 +4,7 @@ use std::default::Default;
44
55use syn:: { spanned:: Spanned , Meta , Path , Result } ;
66
7- use crate :: { util:: MetaListExt , DeriveWhere , Error , Trait } ;
7+ use crate :: { attr :: DeriveTrait , util:: MetaListExt , DeriveWhere , Error , Trait } ;
88
99/// Stores what [`Trait`]s to skip this field or variant for.
1010#[ cfg_attr( test, derive( Debug ) ) ]
@@ -101,6 +101,18 @@ impl Skip {
101101 if let Meta :: Path ( path) = nested_meta {
102102 let skip_group = SkipGroup :: from_path ( path) ?;
103103
104+ if skip_group == SkipGroup :: Clone
105+ && derive_wheres. iter ( ) . any ( |derive_where| {
106+ derive_where
107+ . traits
108+ . iter ( )
109+ . any ( |trait_| trait_ == & DeriveTrait :: Copy )
110+ } ) {
111+ return Err ( Error :: unable_to_skip_clone_while_deriving_copy (
112+ path. span ( ) ,
113+ ) ) ;
114+ }
115+
104116 // Don't allow to skip the same trait twice.
105117 if traits. contains ( & skip_group) {
106118 return Err ( Error :: option_skip_duplicate (
@@ -144,7 +156,7 @@ impl Skip {
144156 pub fn trait_skipped ( & self , trait_ : Trait ) -> bool {
145157 match self {
146158 Skip :: None => false ,
147- Skip :: All => SkipGroup :: trait_supported ( trait_) ,
159+ Skip :: All => SkipGroup :: trait_supported_by_skip_all ( trait_) ,
148160 Skip :: Traits ( skip_groups) => skip_groups
149161 . iter ( )
150162 . any ( |skip_group| skip_group. traits ( ) . any ( |this_trait| this_trait == trait_) ) ,
@@ -166,6 +178,8 @@ impl Skip {
166178#[ derive( Clone , Copy , Eq , PartialEq ) ]
167179#[ cfg_attr( test, derive( Debug ) ) ]
168180pub enum SkipGroup {
181+ /// [`Clone`].
182+ Clone ,
169183 /// [`Debug`].
170184 Debug ,
171185 /// [`Eq`], [`Hash`], [`Ord`], [`PartialEq`] and [`PartialOrd`].
@@ -185,6 +199,7 @@ impl SkipGroup {
185199 use SkipGroup :: * ;
186200
187201 match ident. to_string ( ) . as_str ( ) {
202+ "Clone" => Ok ( Clone ) ,
188203 "Debug" => Ok ( Debug ) ,
189204 "EqHashOrd" => Ok ( EqHashOrd ) ,
190205 "Hash" => Ok ( Hash ) ,
@@ -202,6 +217,7 @@ impl SkipGroup {
202217 /// messages.
203218 const fn as_str ( self ) -> & ' static str {
204219 match self {
220+ Self :: Clone => "Clone" ,
205221 Self :: Debug => "Debug" ,
206222 Self :: EqHashOrd => "EqHashOrd" ,
207223 Self :: Hash => "Hash" ,
@@ -213,6 +229,9 @@ impl SkipGroup {
213229 /// [`Trait`]s supported by this group.
214230 fn traits ( self ) -> impl Iterator < Item = Trait > {
215231 match self {
232+ Self :: Clone => [ Some ( Trait :: Clone ) , None , None , None , None ]
233+ . into_iter ( )
234+ . flatten ( ) ,
216235 Self :: Debug => [ Some ( Trait :: Debug ) , None , None , None , None ]
217236 . into_iter ( )
218237 . flatten ( ) ,
@@ -242,7 +261,7 @@ impl SkipGroup {
242261 }
243262
244263 /// Returns `true` if [`Trait`] is supported by any group.
245- pub fn trait_supported ( trait_ : Trait ) -> bool {
264+ pub fn trait_supported_by_skip_all ( trait_ : Trait ) -> bool {
246265 match trait_ {
247266 Trait :: Clone | Trait :: Copy | Trait :: Default => false ,
248267 Trait :: Debug
0 commit comments