@@ -155,9 +155,10 @@ struct DeriveDiffable {
155155
156156impl 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) ]
238237fn 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(
494495fn 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) ) ]
915918pub 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) ]
922925mod 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