@@ -23,22 +23,22 @@ pub fn parse(fields: &Fields, base_data_size: BaseDataSize) -> Result<Vec<FieldD
2323 Ok ( field_definitions)
2424}
2525
26- fn parse_scalar_field ( ty : & Type ) -> Result < ( Option < usize > , bool ) > {
26+ fn parse_scalar_field ( ty : & Type ) -> Result < Option < ( usize , bool ) > > {
2727 match ty {
2828 Type :: Path ( path) => {
2929 let type_str = path. to_token_stream ( ) . to_string ( ) ;
3030 let result = match type_str. as_str ( ) {
31- "bool" => Some ( ( Some ( BITCOUNT_BOOL ) , false ) ) ,
32- "u8" => Some ( ( Some ( 8 ) , false ) ) ,
33- "i8" => Some ( ( Some ( 8 ) , true ) ) ,
34- "u16" => Some ( ( Some ( 16 ) , false ) ) ,
35- "i16" => Some ( ( Some ( 16 ) , true ) ) ,
36- "u32" => Some ( ( Some ( 32 ) , false ) ) ,
37- "i32" => Some ( ( Some ( 32 ) , true ) ) ,
38- "u64" => Some ( ( Some ( 64 ) , false ) ) ,
39- "i64" => Some ( ( Some ( 64 ) , true ) ) ,
40- "u128" => Some ( ( Some ( 128 ) , false ) ) ,
41- "i128" => Some ( ( Some ( 128 ) , true ) ) ,
31+ "bool" => Some ( Some ( ( BITCOUNT_BOOL , false ) ) ) ,
32+ "u8" => Some ( Some ( ( 8 , false ) ) ) ,
33+ "i8" => Some ( Some ( ( 8 , true ) ) ) ,
34+ "u16" => Some ( Some ( ( 16 , false ) ) ) ,
35+ "i16" => Some ( Some ( ( 16 , true ) ) ) ,
36+ "u32" => Some ( Some ( ( 32 , false ) ) ) ,
37+ "i32" => Some ( Some ( ( 32 , true ) ) ) ,
38+ "u64" => Some ( Some ( ( 64 , false ) ) ) ,
39+ "i64" => Some ( Some ( ( 64 , true ) ) ) ,
40+ "u128" => Some ( Some ( ( 128 , false ) ) ) ,
41+ "i128" => Some ( Some ( ( 128 , true ) ) ) ,
4242 _ => None ,
4343 } ;
4444
@@ -47,15 +47,15 @@ fn parse_scalar_field(ty: &Type) -> Result<(Option<usize>, bool)> {
4747 }
4848
4949 if let Some ( last_segment) = path. path . segments . last ( ) {
50- return Ok ( ( try_parse_arbitrary_int_type ( & last_segment. ident . to_string ( ) ) , false ) ) ;
50+ return Ok ( try_parse_arbitrary_int_type ( & last_segment. ident . to_string ( ) , true ) ) ;
5151 }
5252
5353 Err ( Error :: new ( path. span ( ) , "invalid path for bitfield field" ) )
5454 }
5555 _ => Err ( Error :: new (
5656 ty. span ( ) ,
5757 format ! (
58- "bitfield!: Field type {} not valid. Supported types: bool, u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, arbitrary int (e.g., u1, u3, u62). Their arrays are also supported." ,
58+ "bitfield!: Field type {} not valid. Supported types: bool, u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, arbitrary int (e.g., u1, u3, u62, i81 ). Their arrays are also supported." ,
5959 ty. into_token_stream( )
6060 ) ,
6161 ) ) ,
@@ -132,14 +132,16 @@ fn parse_field(base_data_size: usize, field: &Field) -> Result<FieldDefinition>
132132 _ => ( & field. ty , None ) ,
133133 }
134134 } ;
135- let ( field_type_size_from_data_type, field_type_is_signed) = parse_scalar_field ( ty) ?;
136- let unsigned_field_type = if field_type_is_signed {
137- Some (
138- syn:: parse_str :: < Type > (
139- format ! ( "u{}" , field_type_size_from_data_type. unwrap( ) ) . as_str ( ) ,
135+ let field_type_size_from_data_type = parse_scalar_field ( ty) ?;
136+ let unsigned_field_type = if let Some ( ( bits, is_signed) ) = field_type_size_from_data_type {
137+ if is_signed {
138+ Some (
139+ syn:: parse_str :: < Type > ( format ! ( "u{}" , bits) . as_str ( ) )
140+ . unwrap_or_else ( |_| panic ! ( "bitfield!: Error parsing unsigned_field_type" ) ) ,
140141 )
141- . unwrap_or_else ( |_| panic ! ( "bitfield!: Error parsing unsigned_field_type" ) ) ,
142- )
142+ } else {
143+ None
144+ }
143145 } else {
144146 None
145147 } ;
@@ -323,7 +325,7 @@ fn parse_field(base_data_size: usize, field: &Field) -> Result<FieldDefinition>
323325 panic ! ( "bitfield!: number_of_bits is too large!" )
324326 }
325327 } ) ,
326- Some ( b ) => ( b, quote ! { #ty } ) ,
328+ Some ( ( b , _is_signed ) ) => ( b, quote ! { #ty } ) ,
327329 } ;
328330
329331 if field_type_size == BITCOUNT_BOOL {
@@ -401,7 +403,7 @@ fn parse_field(base_data_size: usize, field: &Field) -> Result<FieldDefinition>
401403 } ;
402404
403405 let use_regular_int = match field_type_size_from_data_type {
404- Some ( i ) => is_int_size_regular_type ( i) ,
406+ Some ( ( i , _is_signed ) ) => is_int_size_regular_type ( i) ,
405407 None => {
406408 // For CustomTypes (e.g. enums), prefer u1 over bool
407409 number_of_bits != 1 && is_int_size_regular_type ( number_of_bits)
@@ -427,7 +429,8 @@ fn parse_field(base_data_size: usize, field: &Field) -> Result<FieldDefinition>
427429 custom_type,
428430 doc_comment,
429431 array : indexed_count. map ( |count| ( count, indexed_stride. unwrap ( ) ) ) ,
430- field_type_size_from_data_type,
432+ field_type_size_from_data_type : field_type_size_from_data_type. map ( |v| v. 0 ) ,
433+ is_signed : field_type_size_from_data_type. map_or ( false , |v| v. 1 ) ,
431434 unsigned_field_type,
432435 } )
433436}
0 commit comments