1
1
pub mod enums;
2
2
3
3
use crate :: attr;
4
- use proc_macro2:: TokenStream ;
4
+ use proc_macro2:: { TokenStream , Ident } ;
5
5
use syn;
6
+ use syn:: Field ;
6
7
7
8
pub fn read_fields ( fields : & syn:: Fields )
8
9
-> TokenStream {
@@ -31,10 +32,11 @@ fn read_named_fields(fields_named: &syn::FieldsNamed)
31
32
-> TokenStream {
32
33
let field_initializers: Vec < _ > = fields_named. named . iter ( ) . map ( |field| {
33
34
let field_name = & field. ident ;
35
+ println ! ( "READING NAMED FIELD {:?}" , field_name) ;
34
36
let field_ty = & field. ty ;
35
- // This field may store the length prefix of another field.
37
+ // This field may store the length prefix of one or more other field.
36
38
let update_hints = update_hints_after_read ( field, & fields_named. named ) ;
37
- let update_hints_fixed = update_hints__fixed_after_read ( field, & fields_named. named ) ;
39
+ let update_hints_fixed = update_hint_fixed_length ( field, & fields_named. named ) ;
38
40
39
41
quote ! {
40
42
#field_name : {
@@ -55,9 +57,12 @@ fn update_hints_after_read<'a>(field: &'a syn::Field,
55
57
-> TokenStream {
56
58
if let Some ( ( length_prefix_of, kind, prefix_subfield_names) ) = length_prefix_of ( field, fields. clone ( ) ) {
57
59
let kind = kind. path_expr ( ) ;
58
-
60
+ let field_name = & field. ident . clone ( ) . map ( |i| i. to_string ( ) ) ;
61
+ let debug = ( field_name, & length_prefix_of, & kind, & prefix_subfield_names) ;
62
+ println ! ( "About to set hints for {:?}, of_index : {:?}, subfield names {:?}" , field_name, & length_prefix_of, & prefix_subfield_names) ;
59
63
quote ! {
60
64
if let Ok ( parcel) = res. as_ref( ) {
65
+ println!( " setting {:?} fields hint {:?}, {:?}, {:?}" , #field_name, #length_prefix_of, ( parcel #( . #prefix_subfield_names) * ) . clone( ) as usize , #kind) ;
61
66
__hints. set_field_length( #length_prefix_of,
62
67
( parcel #( . #prefix_subfield_names) * ) . clone( ) as usize ,
63
68
#kind) ;
@@ -68,9 +73,9 @@ fn update_hints_after_read<'a>(field: &'a syn::Field,
68
73
}
69
74
}
70
75
71
- fn update_hints__fixed_after_read < ' a > ( field : & ' a syn:: Field ,
72
- fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
73
- -> TokenStream {
76
+ fn update_hint_fixed_length < ' a > ( field : & ' a syn:: Field ,
77
+ fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
78
+ -> TokenStream {
74
79
75
80
if let Some ( attr:: Protocol :: FixedLength ( length) ) = attr:: protocol ( & field. attrs ) {
76
81
let position = fields. clone ( ) . into_iter ( ) . position ( |f| f == field) . unwrap ( ) ;
@@ -89,8 +94,10 @@ fn update_hints_after_write<'a>(field: &'a syn::Field,
89
94
if let Some ( ( length_prefix_of, kind, prefix_subfield_names) ) = length_prefix_of ( field, fields. clone ( ) ) {
90
95
let field_name = & field. ident ;
91
96
let kind = kind. path_expr ( ) ;
92
-
97
+ let debug = ( & field. ident . clone ( ) . map ( |i| i. to_string ( ) ) , & length_prefix_of, & kind, & prefix_subfield_names) ;
98
+ println ! ( "About setting hints for {:?}" , debug) ;
93
99
quote ! {
100
+ println!( " WRITE setting {:?} fields hint {:?}, {:?}" , self . #field_name #( . #prefix_subfield_names) * , #length_prefix_of, #kind) ;
94
101
if let Ok ( ( ) ) = res {
95
102
__hints. set_field_length( #length_prefix_of,
96
103
( self . #field_name #( . #prefix_subfield_names) * ) . clone( ) as usize ,
@@ -110,10 +117,10 @@ fn update_hints_after_write<'a>(field: &'a syn::Field,
110
117
/// Returns the field index of the field whose length is specified.
111
118
fn length_prefix_of < ' a > ( field : & ' a syn:: Field ,
112
119
fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
113
- -> Option < ( usize , attr:: LengthPrefixKind , Vec < syn:: Ident > ) > {
120
+ -> Option < Vec < ( usize , attr:: LengthPrefixKind , Vec < syn:: Ident > ) > > {
114
121
let potential_prefix = field. ident . as_ref ( ) ;
115
122
116
- let prefix_of = fields. clone ( ) . into_iter ( ) . find ( |potential_prefix_of| {
123
+ let prefixes_of : Vec < & Ident > = fields. clone ( ) . into_iter ( ) . filter ( |potential_prefix_of| {
117
124
match attr:: protocol ( & potential_prefix_of. attrs ) {
118
125
Some ( attr:: Protocol :: LengthPrefix { ref prefix_field_name, .. } ) => {
119
126
if !fields. clone ( ) . into_iter ( ) . any ( |f| f. ident . as_ref ( ) == Some ( prefix_field_name) ) {
@@ -124,19 +131,23 @@ fn length_prefix_of<'a>(field: &'a syn::Field,
124
131
} ,
125
132
_ => false ,
126
133
}
127
- } ) ;
134
+ } ) . collect ( ) ;
128
135
129
- if let Some ( prefix_of) = prefix_of {
130
- let prefix_of_index = fields. clone ( ) . into_iter ( ) . position ( |f| f == prefix_of) . unwrap ( ) ;
131
- match attr:: protocol ( & prefix_of. attrs ) . unwrap ( ) {
132
- attr:: Protocol :: LengthPrefix { kind, prefix_subfield_names, .. } => {
133
- Some ( ( prefix_of_index, kind. clone ( ) , prefix_subfield_names) )
134
- } ,
135
- _ => unreachable ! ( ) ,
136
- }
137
- } else {
138
- None
139
- }
136
+
137
+ prefixes_of. iter ( )
138
+ . map ( |prefix_of| {
139
+ if let Some ( prefix_of) = prefix_of {
140
+ let prefix_of_index = fields. clone ( ) . into_iter ( ) . position ( |f| f == prefix_of) . unwrap ( ) ;
141
+ match attr:: protocol ( & prefix_of. attrs ) . unwrap ( ) {
142
+ attr:: Protocol :: LengthPrefix { kind, prefix_subfield_names, .. } => {
143
+ Some ( ( prefix_of_index, kind. clone ( ) , prefix_subfield_names) )
144
+ } ,
145
+ _ => unreachable ! ( ) ,
146
+ }
147
+ } else {
148
+ None
149
+ }
150
+ } ) . flatten ( ) . collect ( )
140
151
}
141
152
142
153
fn write_named_fields ( fields_named : & syn:: FieldsNamed )
@@ -145,8 +156,9 @@ fn write_named_fields(fields_named: &syn::FieldsNamed)
145
156
let field_name = & field. ident ;
146
157
// This field may store the length prefix of another field.
147
158
let update_hints = update_hints_after_write ( field, & fields_named. named ) ;
148
- let update_hints_fixed = update_hints__fixed_after_read ( field, & fields_named. named ) ;
159
+ let update_hints_fixed = update_hint_fixed_length ( field, & fields_named. named ) ;
149
160
161
+ println ! ( "WRITE Hints after " ) ;
150
162
quote ! {
151
163
{
152
164
#update_hints_fixed
0 commit comments