1- use std:: mem;
2-
31use proc_macro2:: { TokenStream , TokenTree } ;
42use quote:: quote;
53use syn:: {
@@ -49,7 +47,7 @@ pub struct StructDetails {
4947fn modify_struct ( item : & mut ItemStruct , args : TokenStream ) -> TokenStream {
5048 let assertions = assert_generated_derives ( & item. attrs ) ;
5149
52- let item = reorder_struct_fields ( item, args) . unwrap_or_else ( || quote ! ( #item ) ) ;
50+ reorder_struct_fields ( item, args) ;
5351
5452 quote ! {
5553 #[ repr( C ) ]
@@ -60,22 +58,25 @@ fn modify_struct(item: &mut ItemStruct, args: TokenStream) -> TokenStream {
6058}
6159
6260/// Re-order struct fields, depending on instructions in `STRUCTS` (which is codegen-ed).
63- fn reorder_struct_fields ( item : & mut ItemStruct , args : TokenStream ) -> Option < TokenStream > {
61+ ///
62+ /// Mutates `item` in place, re-ordering its fields.
63+ fn reorder_struct_fields ( item : & mut ItemStruct , args : TokenStream ) {
6464 // Skip foreign types
6565 if let Some ( TokenTree :: Ident ( ident) ) = args. into_iter ( ) . next ( ) {
6666 if ident == "foreign" {
67- return None ;
67+ return ;
6868 }
6969 }
7070
7171 // Get struct data. Exit if no fields need re-ordering.
7272 let struct_name = item. ident . to_string ( ) ;
73- let field_order = STRUCTS [ & struct_name] . field_order ?;
73+ let Some ( field_order) = STRUCTS [ & struct_name] . field_order else {
74+ return ;
75+ } ;
7476
7577 // Re-order fields.
7678 // `field_order` contains indexes of fields in the order they should be.
77- let fields = mem:: replace ( & mut item. fields , Fields :: Unit ) ;
78- let Fields :: Named ( FieldsNamed { brace_token, mut named } ) = fields else { unreachable ! ( ) } ;
79+ let Fields :: Named ( FieldsNamed { named, .. } ) = & mut item. fields else { unreachable ! ( ) } ;
7980
8081 assert ! (
8182 named. len( ) == field_order. len( ) ,
@@ -89,18 +90,14 @@ fn reorder_struct_fields(item: &mut ItemStruct, args: TokenStream) -> Option<Tok
8990 let mut fields = named. clone ( ) . into_pairs ( ) . zip ( field_order) . collect :: < Vec < _ > > ( ) ;
9091 fields. sort_unstable_by_key ( |( _, index) | * * index) ;
9192
92- for field in & mut named {
93+ for field in named. iter_mut ( ) {
9394 field. attrs . insert ( 0 , parse_quote ! ( #[ cfg( doc) ] ) ) ;
9495 }
9596
9697 named. extend ( fields. into_iter ( ) . map ( |( mut pair, _) | {
9798 pair. value_mut ( ) . attrs . insert ( 0 , parse_quote ! ( #[ cfg( not( doc) ) ] ) ) ;
9899 pair
99100 } ) ) ;
100-
101- item. fields = Fields :: Named ( FieldsNamed { brace_token, named } ) ;
102-
103- Some ( quote ! ( #item ) )
104101}
105102
106103/// Generate assertions that traits used in `#[generate_derive]` are in scope.
0 commit comments