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

improve span handling a bit

This commit is contained in:
Robin Appelman 2019-02-28 17:28:37 +01:00
commit f96f44a590

View file

@ -5,7 +5,7 @@
//! # Examples //! # Examples
//! //!
//! ``` //! ```
//! use bitstream_reader_derive::Read; //! use bitstream_reader_derive::BitRead;
//! //!
//! #[derive(BitRead)] //! #[derive(BitRead)]
//! struct TestStruct { //! struct TestStruct {
@ -86,15 +86,16 @@ fn parse(data: &Data, struct_name: &Ident) -> TokenStream {
// Get attributes `#[..]` on each field // Get attributes `#[..]` on each field
let size = get_field_size(f); let size = get_field_size(f);
let field_type = &f.ty; let field_type = &f.ty;
let span = f.span();
match size { match size {
Some(size) => { Some(size) => {
quote_spanned! { f.span() => quote_spanned! {span=>
let size: usize = #size; let size: usize = #size;
let #name:#field_type = stream.read_sized(size)?; let #name:#field_type = stream.read_sized(size)?;
} }
} }
None => { None => {
quote_spanned! { f.span() => quote_spanned! {span=>
let #name:#field_type = stream.read()?; let #name:#field_type = stream.read()?;
} }
} }
@ -102,11 +103,12 @@ fn parse(data: &Data, struct_name: &Ident) -> TokenStream {
}); });
let struct_definition = fields.named.iter().map(|f| { let struct_definition = fields.named.iter().map(|f| {
let name = &f.ident; let name = &f.ident;
quote_spanned! { f.span() => quote_spanned! {f.span()=>
#name, #name,
} }
}); });
quote! { let span = data.struct_token.span();
quote_spanned! {span=>
#(#definitions)* #(#definitions)*
Ok(#struct_name { Ok(#struct_name {
@ -122,16 +124,17 @@ fn parse(data: &Data, struct_name: &Ident) -> TokenStream {
} }
fn get_field_size(field: &Field) -> Option<TokenStream> { fn get_field_size(field: &Field) -> Option<TokenStream> {
let span = field.span();
get_field_attr(field, "size") get_field_attr(field, "size")
.map(|size_lit| match size_lit { .map(|size_lit| match size_lit {
Lit::Int(size) => { Lit::Int(size) => {
quote! { quote_spanned! {span=>
#size #size
} }
} }
Lit::Str(size_field) => { Lit::Str(size_field) => {
let size = Ident::new(&size_field.value(), Span::call_site()); let size = Ident::new(&size_field.value(), Span::call_site());
quote! { quote_spanned! {span=>
#size as usize #size as usize
} }
} }
@ -139,7 +142,7 @@ fn get_field_size(field: &Field) -> Option<TokenStream> {
}) })
.or_else(|| { .or_else(|| {
get_field_attr(field, "size_bits").map(|size_bits_lit| { get_field_attr(field, "size_bits").map(|size_bits_lit| {
quote_spanned! { field.span() => quote_spanned! {span=>
stream.read_int::<usize>(#size_bits_lit)? stream.read_int::<usize>(#size_bits_lit)?
} }
}) })