Skip to content

Commit 87dcf9d

Browse files
committed
Make Clippy happy
1 parent 07cf995 commit 87dcf9d

4 files changed

Lines changed: 98 additions & 64 deletions

File tree

difficient-macros/src/lib.rs

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,10 @@ struct DeriveDiffable {
155155

156156
impl DeriveDiffable {
157157
fn derive(&self, serde_feature: bool, derive_visitor: bool) -> TokenStream {
158-
if !self.generics.params.is_empty() {
159-
panic!("derive(Diffable) does not support generic parameters")
160-
}
158+
assert!(
159+
self.generics.params.is_empty(),
160+
"derive(Diffable) does not support generic parameters"
161+
);
161162

162163
let name = &self.ident;
163164

@@ -167,9 +168,7 @@ impl DeriveDiffable {
167168
Data::Enum(variants) => variants.iter().any(|ed| ed.fields.iter().any(|f| f.skip)),
168169
Data::Struct(fields) => fields.iter().any(|f| f.skip),
169170
};
170-
if has_any_skipped_fields {
171-
panic!("cannot skip fields in atomic diff");
172-
}
171+
assert!(!has_any_skipped_fields, "cannot skip fields in atomic diff");
173172
return quote! {
174173
impl<'a> difficient::Diffable<'a> for #name {
175174
type Diff = difficient::AtomicDiff<'a, Self>;
@@ -195,23 +194,23 @@ impl DeriveDiffable {
195194
let tag = self.serde.variant_tag();
196195
enum_impl(
197196
variants,
198-
tag,
197+
&tag,
199198
name,
200-
diff_ty,
199+
&diff_ty,
201200
vis,
202-
serde_derive,
203-
serde_container_rename_all,
201+
serde_derive.as_ref(),
202+
serde_container_rename_all.as_ref(),
204203
derive_visitor,
205204
self.visit_transparent || self.serde.transparent,
206205
)
207206
}
208207
Data::Struct(fields) => struct_impl(
209208
fields,
210209
name,
211-
diff_ty,
210+
&diff_ty,
212211
vis,
213-
serde_derive,
214-
serde_container_rename_all,
212+
serde_derive.as_ref(),
213+
serde_container_rename_all.as_ref(),
215214
derive_visitor,
216215
self.visit_transparent || self.serde.transparent,
217216
),
@@ -237,12 +236,12 @@ impl ToTokens for DeriveDiffable {
237236
)]
238237
fn enum_impl(
239238
variants: &[EnumData],
240-
variant_tag: SerdeVariantTag,
239+
variant_tag: &SerdeVariantTag,
241240
name: &Ident,
242-
diff_ty: Ident,
241+
diff_ty: &Ident,
243242
vis: &syn::Visibility,
244-
serde_derive: Option<TokenStream>,
245-
serde_container_rename_all: Option<SerdeRenameAllCase>,
243+
serde_derive: Option<&TokenStream>,
244+
serde_container_rename_all: Option<&SerdeRenameAllCase>,
246245
derive_visitor: bool,
247246
transparent: bool,
248247
) -> TokenStream {
@@ -313,7 +312,7 @@ fn enum_impl(
313312
let variant_diff_impl = variants.iter().zip(var_name.iter()).map(|(var, var_name)| {
314313
let pattern_match_left = pattern_match(&var.fields, "left", true);
315314
let pattern_match_right = pattern_match(&var.fields, "right", true);
316-
let diff_impl = variant_diff_body(&diff_ty, var_name, &var.fields);
315+
let diff_impl = variant_diff_body(diff_ty, var_name, &var.fields);
317316
quote! {
318317
(Self::#var_name #pattern_match_left, Self::#var_name #pattern_match_right) => {
319318
#diff_impl
@@ -369,11 +368,13 @@ fn enum_impl(
369368
let visit_enum_variant_impl = variants.iter().zip(var_name.iter()).map(|(var, var_name)| {
370369
let ident = get_idents(&var.fields);
371370
let num_non_skipped_fields = var.fields.iter().filter(|f| !f.skip).count();
371+
#[expect(clippy::map_unwrap_or, reason = "more readable this way")]
372372
let serde_var_rename = var.rename.as_ref().map(|r| quote! { Some(#r) }).unwrap_or_else(||
373-
match serde_container_rename_all.as_ref().map(|r| r.do_rename(var_name)) {
374-
Some(r) => quote! { Some(#r) },
375-
None => quote! { None },
376-
});
373+
if let Some(r) = serde_container_rename_all.as_ref().map(|r| r.do_rename(var_name)) {
374+
quote! { Some(#r) } }
375+
else {
376+
quote! { None }
377+
});
377378
match var.fields.style {
378379
Style::Tuple => {
379380
if num_non_skipped_fields == 0 {
@@ -420,7 +421,7 @@ fn enum_impl(
420421
}
421422
}
422423
let var_name_str = var_name.to_string();
423-
let ident_str = ident.iter().map(|i| i.to_string());
424+
let ident_str = ident.iter().map(std::string::ToString::to_string);
424425
let var_rename_all: Option<SerdeRenameAllCase> = var.rename_all.as_ref().map(|r| r.parse().unwrap());
425426
let serde_field_rename: Vec<_> = var.fields
426427
.iter()
@@ -494,20 +495,21 @@ fn enum_impl(
494495
fn struct_impl(
495496
fields: &Fields<StructLike>,
496497
name: &Ident,
497-
diff_ty: Ident,
498+
diff_ty: &Ident,
498499
vis: &syn::Visibility,
499-
serde_derive: Option<TokenStream>,
500-
serde_rename_all: Option<SerdeRenameAllCase>,
500+
serde_derive: Option<&TokenStream>,
501+
serde_rename_all: Option<&SerdeRenameAllCase>,
501502
derive_visitor: bool,
502503
transparent: bool,
503504
) -> TokenStream {
504505
let ty = fields.iter().map(|data| &data.ty).collect::<Vec<_>>();
505506
let num_skipped_fields = fields.iter().filter(|f| f.skip).count();
506507
let num_non_skipped_fields = fields.iter().filter(|f| !f.skip).count();
507508

508-
if transparent && num_non_skipped_fields != 1 {
509-
panic!("visit_transparent only makes sense when applied to newtypes")
510-
}
509+
assert!(
510+
!(transparent && num_non_skipped_fields != 1),
511+
"visit_transparent only makes sense when applied to newtypes"
512+
);
511513

512514
if matches!(fields.style, Style::Unit) || num_non_skipped_fields == 0 {
513515
// short-circuit return
@@ -520,7 +522,7 @@ fn struct_impl(
520522
}
521523
}
522524
};
523-
};
525+
}
524526

525527
let field = get_idents(fields);
526528
let field_diff_ty: Vec<_> = fields
@@ -675,7 +677,7 @@ fn struct_impl(
675677
}
676678
}
677679
Style::Struct => {
678-
let ident_str = ident.iter().map(|i| i.to_string());
680+
let ident_str = ident.iter().map(std::string::ToString::to_string);
679681
let serde_rename: Vec<_> = fields
680682
.iter()
681683
.filter(|f| !f.skip)
@@ -911,6 +913,7 @@ fn get_accessors(fields: &Fields<StructLike>, monotonic_index: bool) -> Vec<Toke
911913
.collect()
912914
}
913915

916+
#[expect(clippy::missing_panics_doc, reason = "Macro implementation")]
914917
#[proc_macro_derive(Diffable, attributes(diffable, serde))]
915918
pub fn derive_diffable(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
916919
let ast: DeriveInput = syn::parse(tokens).unwrap();
@@ -920,6 +923,7 @@ pub fn derive_diffable(tokens: proc_macro::TokenStream) -> proc_macro::TokenStre
920923

921924
#[cfg(test)]
922925
mod tests {
926+
#![expect(clippy::too_many_lines, reason = "tests")]
923927
use super::*;
924928

925929
#[test]
@@ -1028,15 +1032,15 @@ mod tests {
10281032

10291033
#[test]
10301034
fn test_derive_skipped_field() {
1031-
let input = r#"
1035+
let input = r"
10321036
#[derive(Diffable)]
10331037
struct SkipStruct {
10341038
x: i32,
10351039
#[diffable(skip)]
10361040
y: String,
10371041
z: u64,
10381042
}
1039-
"#;
1043+
";
10401044
let parsed = syn::parse_str(input).unwrap();
10411045
let diff = DeriveDiffable::from_derive_input(&parsed).unwrap();
10421046

@@ -1117,10 +1121,10 @@ mod tests {
11171121

11181122
#[test]
11191123
fn test_derive_tuple_struct() {
1120-
let input = r#"
1124+
let input = r"
11211125
#[derive(Diffable)]
11221126
struct TupleStruct(i32, #[diffable(skip)] String, i64, #[diffable(skip)] F);
1123-
"#;
1127+
";
11241128
let parsed = syn::parse_str(input).unwrap();
11251129
let diff = DeriveDiffable::from_derive_input(&parsed).unwrap();
11261130

@@ -1370,7 +1374,7 @@ mod tests {
13701374

13711375
#[test]
13721376
fn test_derive_skippable_enum() {
1373-
let input = r#"
1377+
let input = r"
13741378
#[derive(Diffable)]
13751379
enum SkipEnum {
13761380
First(#[diffable(skip)] i32, u64),
@@ -1381,7 +1385,7 @@ mod tests {
13811385
z: String
13821386
}
13831387
}
1384-
"#;
1388+
";
13851389

13861390
let parsed = syn::parse_str(input).unwrap();
13871391
let diff = DeriveDiffable::from_derive_input(&parsed).unwrap();
@@ -1523,14 +1527,14 @@ mod tests {
15231527

15241528
#[test]
15251529
fn test_derive_atomic() {
1526-
let input = r#"
1530+
let input = r"
15271531
#[derive(Diffable)]
15281532
#[diffable(atomic)]
15291533
enum Atomic {
15301534
First(X),
15311535
Second { x: Y, y: Z }
15321536
}
1533-
"#;
1537+
";
15341538

15351539
let parsed = syn::parse_str(input).unwrap();
15361540
let diff = DeriveDiffable::from_derive_input(&parsed).unwrap();
@@ -1558,13 +1562,13 @@ mod tests {
15581562

15591563
#[test]
15601564
fn test_transparent() {
1561-
let input = r#"
1565+
let input = r"
15621566
#[derive(Diffable)]
15631567
#[serde(transparent)]
15641568
enum SeeThrough {
15651569
A(X),
15661570
}
1567-
"#;
1571+
";
15681572

15691573
let parsed = syn::parse_str(input).unwrap();
15701574
let diff = DeriveDiffable::from_derive_input(&parsed).unwrap();

0 commit comments

Comments
 (0)