1
0
Fork 0
mirror of https://codeberg.org/icewind/bitbuffer.git synced 2026-06-03 16:44:06 +02:00

bit_size cleanup

This commit is contained in:
Robin Appelman 2019-06-22 16:52:00 +02:00
commit 0898cb6b5d

View file

@ -139,8 +139,8 @@ use proc_macro2::{Span, TokenStream};
use quote::{quote, quote_spanned}; use quote::{quote, quote_spanned};
use syn::spanned::Spanned; use syn::spanned::Spanned;
use syn::{ use syn::{
parse_macro_input, parse_quote, parse_str, Attribute, Data, DeriveInput, Expr, Fields, Ident, parse_macro_input, parse_quote, parse_str, Attribute, Data, DataStruct, DeriveInput, Expr,
Lit, LitStr, Path, Variant, Fields, Ident, Lit, LitStr, Path, Variant,
}; };
use syn_util::get_attribute_value; use syn_util::get_attribute_value;
@ -321,7 +321,7 @@ fn parse(data: &Data, struct_name: &Ident, attrs: &Vec<Attribute>) -> TokenStrea
} }
} }
fn get_field_size(attrs: &Vec<Attribute>, span: Span) -> Option<TokenStream> { fn get_field_size(attrs: &[Attribute], span: Span) -> Option<TokenStream> {
get_attribute_value(attrs, &["size"]) get_attribute_value(attrs, &["size"])
.map(|size_lit| match size_lit { .map(|size_lit| match size_lit {
Lit::Int(size) => { Lit::Int(size) => {
@ -370,7 +370,7 @@ fn derive_bitsize_trait(
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
let sum = bit_size_sum(&input.data); let sum = bit_size_sum(input.data);
let trait_def_str = format!("::bitstream_reader::{}", trait_name); let trait_def_str = format!("::bitstream_reader::{}", trait_name);
let trait_def = parse_str::<Path>(&trait_def_str).unwrap(); let trait_def = parse_str::<Path>(&trait_def_str).unwrap();
@ -389,33 +389,36 @@ fn derive_bitsize_trait(
} }
// Generate an expression to sum up the heap size of each field. // Generate an expression to sum up the heap size of each field.
fn bit_size_sum(data: &Data) -> TokenStream { fn bit_size_sum(data: Data) -> TokenStream {
match *data { match data {
Data::Struct(ref data) => match data.fields { Data::Struct(DataStruct {
Fields::Named(ref fields) => { fields: Fields::Named(fields),
let recurse = fields.named.iter().map(|f| { ..
let field_type = &f.ty; }) => {
let size = get_field_size(&f.attrs, f.span()); let recurse = fields.named.into_iter().map(|f| {
match size { let span = f.span();
Some(size) => { let field_type = f.ty;
quote_spanned! {f.span()=> match get_field_size(&f.attrs, span) {
::bitstream_reader::bit_size_of_sized::<#field_type>(#size) Some(size) => {
} quote_spanned! {span=>
::bitstream_reader::bit_size_of_sized::<#field_type>(#size)
} }
None => { }
quote_spanned! {f.span()=> None => {
::bitstream_reader::bit_size_of::<#field_type>() quote_spanned! {span=>
} ::bitstream_reader::bit_size_of::<#field_type>()
} }
} }
});
quote! {
0 #(+ #recurse)*
} }
});
quote! {
0 #(+ #recurse)*
} }
Fields::Unit => quote!(0), }
_ => unimplemented!(), Data::Struct(DataStruct {
}, fields: Fields::Unit,
..
}) => quote!(0),
_ => unimplemented!(), _ => unimplemented!(),
} }
} }