1- pub mod enums;
2-
3- use crate :: attr;
4- use proc_macro2:: { TokenStream , Ident } ;
1+ use proc_macro2:: TokenStream ;
52use syn;
63use syn:: Field ;
74
5+ use crate :: attr;
6+
7+ pub mod enums;
8+
89pub fn read_fields ( fields : & syn:: Fields )
9- -> TokenStream {
10+ -> TokenStream {
1011 match * fields {
1112 syn:: Fields :: Named ( ref fields_named) => read_named_fields ( fields_named) ,
1213 syn:: Fields :: Unnamed ( ref fields_unnamed) => read_unnamed_fields ( fields_unnamed) ,
@@ -15,7 +16,7 @@ pub fn read_fields(fields: &syn::Fields)
1516}
1617
1718pub fn write_fields ( fields : & syn:: Fields )
18- -> TokenStream {
19+ -> TokenStream {
1920 match * fields {
2021 syn:: Fields :: Named ( ref fields_named) => write_named_fields ( fields_named) ,
2122 syn:: Fields :: Unnamed ( ref fields_unnamed) => write_unnamed_fields ( fields_unnamed) ,
@@ -32,7 +33,6 @@ fn read_named_fields(fields_named: &syn::FieldsNamed)
3233 -> TokenStream {
3334 let field_initializers: Vec < _ > = fields_named. named . iter ( ) . map ( |field| {
3435 let field_name = & field. ident ;
35- println ! ( "READING NAMED FIELD {:?}" , field_name) ;
3636 let field_ty = & field. ty ;
3737 // This field may store the length prefix of one or more other field.
3838 let update_hints = update_hints_after_read ( field, & fields_named. named ) ;
@@ -55,29 +55,30 @@ fn read_named_fields(fields_named: &syn::FieldsNamed)
5555fn update_hints_after_read < ' a > ( field : & ' a syn:: Field ,
5656 fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
5757 -> TokenStream {
58- if let Some ( ( length_prefix_of , kind , prefix_subfield_names ) ) = length_prefix_of ( field, fields. clone ( ) ) {
58+ let hint_setters = length_prefix_of ( field, fields. clone ( ) ) . iter ( ) . map ( | ( length_prefix_of , kind , prefix_subfield_names ) | {
5959 let kind = kind. path_expr ( ) ;
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) ;
60+ quote ! {
61+ __hints. set_field_length( #length_prefix_of,
62+ ( parcel #( . #prefix_subfield_names) * ) . clone( ) as usize ,
63+ #kind) ;
64+ }
65+ } ) . collect :: < Vec < TokenStream > > ( ) ;
66+
67+ if hint_setters. is_empty ( ) {
68+ quote ! { }
69+ } else {
6370 quote ! {
6471 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) ;
66- __hints. set_field_length( #length_prefix_of,
67- ( parcel #( . #prefix_subfield_names) * ) . clone( ) as usize ,
68- #kind) ;
72+ #( #hint_setters) ; *
6973 }
7074 }
71- } else {
72- quote ! { }
7375 }
7476}
7577
7678fn update_hint_fixed_length < ' a > ( field : & ' a syn:: Field ,
7779 fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
7880 -> TokenStream {
79-
80- if let Some ( attr:: Protocol :: FixedLength ( length) ) = attr:: protocol ( & field. attrs ) {
81+ if let Some ( attr:: Protocol :: FixedLength ( length) ) = attr:: protocol ( & field. attrs ) {
8182 let position = fields. clone ( ) . into_iter ( ) . position ( |f| f == field) . unwrap ( ) ;
8283
8384 quote ! {
@@ -90,22 +91,26 @@ fn update_hint_fixed_length<'a>(field: &'a syn::Field,
9091
9192fn update_hints_after_write < ' a > ( field : & ' a syn:: Field ,
9293 fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
93- -> TokenStream {
94- if let Some ( ( length_prefix_of , kind , prefix_subfield_names ) ) = length_prefix_of ( field, fields. clone ( ) ) {
94+ -> TokenStream {
95+ let hint_setters = length_prefix_of ( field, fields. clone ( ) ) . iter ( ) . map ( | ( length_prefix_of , kind , prefix_subfield_names ) | {
9596 let field_name = & field. ident ;
9697 let kind = kind. path_expr ( ) ;
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) ;
98+
9999 quote ! {
100- println!( " WRITE setting {:?} fields hint {:?}, {:?}" , self . #field_name #( . #prefix_subfield_names) * , #length_prefix_of, #kind) ;
101- if let Ok ( ( ) ) = res {
102100 __hints. set_field_length( #length_prefix_of,
103101 ( self . #field_name #( . #prefix_subfield_names) * ) . clone( ) as usize ,
104102 #kind) ;
105- }
106103 }
104+ } ) . collect :: < Vec < TokenStream > > ( ) ;
105+
106+ if hint_setters. is_empty ( ) {
107+ quote ! { }
107108 } else {
108- quote ! { }
109+ quote ! {
110+ if let Ok ( ( ) ) = res {
111+ #( #hint_setters) ; *
112+ }
113+ }
109114 }
110115}
111116
@@ -117,37 +122,33 @@ fn update_hints_after_write<'a>(field: &'a syn::Field,
117122/// Returns the field index of the field whose length is specified.
118123fn length_prefix_of < ' a > ( field : & ' a syn:: Field ,
119124 fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
120- -> Option < Vec < ( usize , attr:: LengthPrefixKind , Vec < syn:: Ident > ) > > {
125+ -> Vec < ( usize , attr:: LengthPrefixKind , Vec < syn:: Ident > ) > {
121126 let potential_prefix = field. ident . as_ref ( ) ;
122127
123- let prefixes_of: Vec < & Ident > = fields. clone ( ) . into_iter ( ) . filter ( |potential_prefix_of| {
128+ let prefixes_of: Vec < & ' a Field > = fields. clone ( ) . into_iter ( ) . filter ( |potential_prefix_of| {
124129 match attr:: protocol ( & potential_prefix_of. attrs ) {
125130 Some ( attr:: Protocol :: LengthPrefix { ref prefix_field_name, .. } ) => {
126131 if !fields. clone ( ) . into_iter ( ) . any ( |f| f. ident . as_ref ( ) == Some ( prefix_field_name) ) {
127132 panic ! ( "length prefix is invalid: there is no sibling field named '{}" , prefix_field_name) ;
128133 }
129134
130135 potential_prefix == Some ( prefix_field_name)
131- } ,
136+ }
132137 _ => false ,
133138 }
134139 } ) . collect ( ) ;
135140
136141
137142 prefixes_of. iter ( )
138143 . 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 ! ( ) ,
144+ let prefix_of_index = fields. clone ( ) . into_iter ( ) . position ( |f| & f == prefix_of) . unwrap ( ) ;
145+ match attr:: protocol ( & prefix_of. attrs ) . unwrap ( ) {
146+ attr:: Protocol :: LengthPrefix { kind, prefix_subfield_names, .. } => {
147+ ( prefix_of_index, kind. clone ( ) , prefix_subfield_names)
146148 }
147- } else {
148- None
149+ _ => unreachable ! ( ) ,
149150 }
150- } ) . flatten ( ) . collect ( )
151+ } ) . collect ( )
151152}
152153
153154fn write_named_fields ( fields_named : & syn:: FieldsNamed )
@@ -158,7 +159,6 @@ fn write_named_fields(fields_named: &syn::FieldsNamed)
158159 let update_hints = update_hints_after_write ( field, & fields_named. named ) ;
159160 let update_hints_fixed = update_hint_fixed_length ( field, & fields_named. named ) ;
160161
161- println ! ( "WRITE Hints after " ) ;
162162 quote ! {
163163 {
164164 #update_hints_fixed
@@ -174,7 +174,7 @@ fn write_named_fields(fields_named: &syn::FieldsNamed)
174174}
175175
176176fn read_unnamed_fields ( fields_unnamed : & syn:: FieldsUnnamed )
177- -> TokenStream {
177+ -> TokenStream {
178178 let field_initializers: Vec < _ > = fields_unnamed. unnamed . iter ( ) . map ( |field| {
179179 let field_ty = & field. ty ;
180180
@@ -191,7 +191,7 @@ fn read_unnamed_fields(fields_unnamed: &syn::FieldsUnnamed)
191191}
192192
193193fn write_unnamed_fields ( fields_unnamed : & syn:: FieldsUnnamed )
194- -> TokenStream {
194+ -> TokenStream {
195195 let field_indices = ( 0 ..fields_unnamed. unnamed . len ( ) ) . into_iter ( ) . map ( syn:: Index :: from) ;
196196
197197 let field_writers: Vec < _ > = field_indices. map ( |field_index| {
0 commit comments