11use proc_macro2:: { Ident , Span , TokenStream } ;
22use quote:: quote;
3- use syn:: { parse_macro_input, parse_quote, Attribute , Data , DataEnum , DeriveInput , Field , Fields , Generics , Lit , LitInt , Meta , NestedMeta } ;
3+ use syn:: {
4+ Attribute , Data , DataEnum , DeriveInput , Field , Fields , Lit , LitInt , Meta , NestedMeta ,
5+ parse_macro_input, parse_quote,
6+ } ;
47
58pub fn derive ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
69 let input = parse_macro_input ! ( input as DeriveInput ) ;
@@ -10,14 +13,14 @@ pub fn derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
1013 match & input. data {
1114 Data :: Struct ( data) => {
1215 deser_code = gen_deser_code_struct ( & data. fields ) ;
13- ser_code = gen_ser_code_struct ( & data. fields , & name) ;
14- } ,
16+ ser_code = gen_ser_code_struct ( & data. fields , name) ;
17+ }
1518 Data :: Enum ( data) => {
1619 let ty = get_enum_type ( & input) ;
1720 let pre_disc_padding = get_pre_disc_padding ( & input) ;
1821 let post_disc_padding = get_post_disc_padding ( & input) ;
19- deser_code = gen_deser_code_enum ( data, & name, & ty, & pre_disc_padding, & post_disc_padding) ;
20- ser_code = gen_ser_code_enum ( data, & name, & ty, & pre_disc_padding, & post_disc_padding, & input . generics ) ;
22+ deser_code = gen_deser_code_enum ( data, name, & ty, & pre_disc_padding, & post_disc_padding) ;
23+ ser_code = gen_ser_code_enum ( data, name, & ty, & pre_disc_padding, & post_disc_padding) ;
2124 }
2225 Data :: Union ( _) => unimplemented ! ( ) ,
2326 }
@@ -182,7 +185,7 @@ fn gen_ser_code_struct(fields: &Fields, name: &Ident) -> TokenStream {
182185 }
183186}
184187
185- fn gen_ser_code_enum ( data : & DataEnum , name : & Ident , ty : & Ident , pre_disc_padding : & Option < LitInt > , post_disc_padding : & Option < LitInt > , generics : & Generics ) -> TokenStream {
188+ fn gen_ser_code_enum ( data : & DataEnum , name : & Ident , ty : & Ident , pre_disc_padding : & Option < LitInt > , post_disc_padding : & Option < LitInt > ) -> TokenStream {
186189 let mut arms = vec ! [ ] ;
187190 for f in & data. variants {
188191 let ident = & f. ident ;
@@ -194,7 +197,7 @@ fn gen_ser_code_enum(data: &DataEnum, name: &Ident, ty: &Ident, pre_disc_padding
194197 let write_post_padding = gen_write_padding ( post_disc_padding) ;
195198 quote ! {
196199 #write_pre_padding
197- let disc = unsafe { * ( self as * const #name #generics as * const #ty ) } ;
200+ let disc = unsafe { * :: std :: ptr :: from_ref ( self ) . cast :: <#ty> ( ) } ;
198201 :: endio:: LEWrite :: write( writer, disc) ?;
199202 #write_post_padding
200203 match self {
0 commit comments