Skip to content

Commit a2628df

Browse files
committed
De-duplicate searching for skippable traits
1 parent 35f14cf commit a2628df

File tree

6 files changed

+24
-23
lines changed

6 files changed

+24
-23
lines changed

src/attr/default.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl Default {
3030
let mut impl_default = false;
3131

3232
for derive_where in derive_wheres {
33-
if derive_where.trait_(Trait::Default).is_some() {
33+
if derive_where.trait_(&Trait::Default).is_some() {
3434
impl_default = true;
3535
break;
3636
}

src/attr/item.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use syn::{
77
parse::{discouraged::Speculative, Parse, ParseStream},
88
punctuated::Punctuated,
99
spanned::Spanned,
10-
Attribute, Data, Ident, Meta, NestedMeta, Path, PredicateType, Result, Token, TraitBound, Type,
11-
TypeParamBound, TypePath, WhereClause, WherePredicate,
10+
Attribute, Data, Ident, Meta, NestedMeta, Path, PredicateType, Result, Token, TraitBound,
11+
TraitBoundModifier, Type, TypeParamBound, TypePath, WhereClause, WherePredicate,
1212
};
1313

1414
use crate::{util, Error, Item, Skip, Trait, TraitImpl, DERIVE_WHERE};
@@ -175,10 +175,10 @@ impl DeriveWhere {
175175
}
176176

177177
/// Returns selected [`DeriveTrait`] if present.
178-
pub fn trait_(&self, trait_: Trait) -> Option<&DeriveTrait> {
178+
pub fn trait_(&self, trait_: &Trait) -> Option<&DeriveTrait> {
179179
self.traits
180180
.iter()
181-
.find(|derive_trait| ***derive_trait == trait_)
181+
.find(|derive_trait| &***derive_trait == trait_)
182182
}
183183

184184
/// Returns `true` if any [`CustomBound`](Generic::CustomBound) is present.
@@ -203,6 +203,11 @@ impl DeriveWhere {
203203
})
204204
}
205205

206+
/// Returns `true` if any [`Trait`] supports skipping.
207+
pub fn any_skip(&self) -> bool {
208+
self.traits.iter().any(|trait_| trait_.supports_skip())
209+
}
210+
206211
/// Create [`WhereClause`] for the given parameters.
207212
pub fn where_clause(
208213
&self,
@@ -386,11 +391,12 @@ impl DeriveTrait {
386391

387392
list.push(TypeParamBound::Trait(TraitBound {
388393
paren_token: None,
389-
modifier: syn::TraitBoundModifier::None,
394+
modifier: TraitBoundModifier::None,
390395
lifetimes: None,
391396
path: self.path(),
392397
}));
393398

399+
// Add bounds specific to the trait.
394400
if let Some(bound) = self.additional_where_bounds(data) {
395401
list.push(bound)
396402
}

src/attr/skip.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,10 @@ impl Skip {
6161
Some(Skip::None) | Some(Skip::Traits(..)) | None => {
6262
// Don't allow to skip all traits if no trait to be implemented supports
6363
// skipping.
64-
if derive_wheres.iter().any(|derive_where| {
65-
derive_where
66-
.traits
67-
.iter()
68-
.any(|trait_| trait_.supports_skip())
69-
}) {
64+
if derive_wheres
65+
.iter()
66+
.any(|derive_where| derive_where.any_skip())
67+
{
7068
*self = Skip::All;
7169
Ok(())
7270
} else {
@@ -133,10 +131,7 @@ impl Skip {
133131
_ => {
134132
// Don't allow to skip trait that isn't being implemented.
135133
if derive_wheres.iter().any(|derive_where| {
136-
derive_where
137-
.traits
138-
.iter()
139-
.any(|derive_trait| **derive_trait == trait_)
134+
derive_where.trait_(&trait_).is_some()
140135
}) {
141136
traits.push(trait_)
142137
} else {

src/attr/zeroize_fqs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl ZeroizeFqs {
1919

2020
if !derive_wheres
2121
.iter()
22-
.any(|derive_where| derive_where.trait_(Trait::Zeroize).is_some())
22+
.any(|derive_where| derive_where.trait_(&Trait::Zeroize).is_some())
2323
{
2424
return Err(Error::zeroize(meta.span()));
2525
}

src/input.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ impl<'a> Input<'a> {
8383
if !accumulated_defaults.0
8484
&& derive_wheres
8585
.iter()
86-
.any(|derive_where| derive_where.trait_(Trait::Default).is_some())
86+
.any(|derive_where| derive_where.trait_(&Trait::Default).is_some())
8787
{
8888
return Err(Error::default_missing(span));
8989
}
@@ -118,7 +118,7 @@ impl<'a> Input<'a> {
118118
{
119119
if let Some(DeriveTrait::Zeroize {
120120
crate_: Some(_), ..
121-
}) = derive_where.trait_(Trait::Zeroize)
121+
}) = derive_where.trait_(&Trait::Zeroize)
122122
{
123123
true
124124
} else {
@@ -180,7 +180,7 @@ impl<'a> Input<'a> {
180180
let mut found_use_case = false;
181181
// `Default` is used on an enum.
182182
found_use_case |= match item {
183-
Item::Enum { .. } => derive_where.trait_(Trait::Default).is_some(),
183+
Item::Enum { .. } => derive_where.trait_(&Trait::Default).is_some(),
184184
Item::Item(_) => false,
185185
};
186186
// Any field is skipped with a corresponding `Trait`.
@@ -196,7 +196,7 @@ impl<'a> Input<'a> {
196196
{
197197
if let Some(DeriveTrait::Zeroize {
198198
crate_: Some(_), ..
199-
}) = derive_where.trait_(Trait::Zeroize)
199+
}) = derive_where.trait_(&Trait::Zeroize)
200200
{
201201
true
202202
} else {
@@ -205,7 +205,7 @@ impl<'a> Input<'a> {
205205
}
206206
};
207207
// `Zeroize(fqs)` is used on any field.
208-
found_use_case |= derive_where.trait_(Trait::Zeroize).is_some() && item.any_fqs();
208+
found_use_case |= derive_where.trait_(&Trait::Zeroize).is_some() && item.any_fqs();
209209
}
210210

211211
if !found_use_case {

src/item.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ impl Item<'_> {
5050
match self {
5151
Item::Enum { .. } => derive_wheres
5252
.iter()
53-
.any(|derive_where| derive_where.trait_(Trait::Default).is_some()),
53+
.any(|derive_where| derive_where.trait_(&Trait::Default).is_some()),
5454
_ => false,
5555
}
5656
}

0 commit comments

Comments
 (0)