1
- pub mod enums;
2
-
3
- use crate :: attr;
4
- use proc_macro2:: { TokenStream , Ident } ;
1
+ use proc_macro2:: TokenStream ;
5
2
use syn;
6
3
use syn:: Field ;
7
4
5
+ use crate :: attr;
6
+
7
+ pub mod enums;
8
+
8
9
pub fn read_fields ( fields : & syn:: Fields )
9
- -> TokenStream {
10
+ -> TokenStream {
10
11
match * fields {
11
12
syn:: Fields :: Named ( ref fields_named) => read_named_fields ( fields_named) ,
12
13
syn:: Fields :: Unnamed ( ref fields_unnamed) => read_unnamed_fields ( fields_unnamed) ,
@@ -15,7 +16,7 @@ pub fn read_fields(fields: &syn::Fields)
15
16
}
16
17
17
18
pub fn write_fields ( fields : & syn:: Fields )
18
- -> TokenStream {
19
+ -> TokenStream {
19
20
match * fields {
20
21
syn:: Fields :: Named ( ref fields_named) => write_named_fields ( fields_named) ,
21
22
syn:: Fields :: Unnamed ( ref fields_unnamed) => write_unnamed_fields ( fields_unnamed) ,
@@ -32,7 +33,6 @@ fn read_named_fields(fields_named: &syn::FieldsNamed)
32
33
-> TokenStream {
33
34
let field_initializers: Vec < _ > = fields_named. named . iter ( ) . map ( |field| {
34
35
let field_name = & field. ident ;
35
- println ! ( "READING NAMED FIELD {:?}" , field_name) ;
36
36
let field_ty = & field. ty ;
37
37
// This field may store the length prefix of one or more other field.
38
38
let update_hints = update_hints_after_read ( field, & fields_named. named ) ;
@@ -55,29 +55,30 @@ fn read_named_fields(fields_named: &syn::FieldsNamed)
55
55
fn update_hints_after_read < ' a > ( field : & ' a syn:: Field ,
56
56
fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
57
57
-> 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 ) | {
59
59
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 {
63
70
quote ! {
64
71
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) ; *
69
73
}
70
74
}
71
- } else {
72
- quote ! { }
73
75
}
74
76
}
75
77
76
78
fn update_hint_fixed_length < ' a > ( field : & ' a syn:: Field ,
77
79
fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
78
80
-> 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 ) {
81
82
let position = fields. clone ( ) . into_iter ( ) . position ( |f| f == field) . unwrap ( ) ;
82
83
83
84
quote ! {
@@ -90,22 +91,26 @@ fn update_hint_fixed_length<'a>(field: &'a syn::Field,
90
91
91
92
fn update_hints_after_write < ' a > ( field : & ' a syn:: Field ,
92
93
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 ) | {
95
96
let field_name = & field. ident ;
96
97
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
+
99
99
quote ! {
100
- println!( " WRITE setting {:?} fields hint {:?}, {:?}" , self . #field_name #( . #prefix_subfield_names) * , #length_prefix_of, #kind) ;
101
- if let Ok ( ( ) ) = res {
102
100
__hints. set_field_length( #length_prefix_of,
103
101
( self . #field_name #( . #prefix_subfield_names) * ) . clone( ) as usize ,
104
102
#kind) ;
105
- }
106
103
}
104
+ } ) . collect :: < Vec < TokenStream > > ( ) ;
105
+
106
+ if hint_setters. is_empty ( ) {
107
+ quote ! { }
107
108
} else {
108
- quote ! { }
109
+ quote ! {
110
+ if let Ok ( ( ) ) = res {
111
+ #( #hint_setters) ; *
112
+ }
113
+ }
109
114
}
110
115
}
111
116
@@ -117,37 +122,33 @@ fn update_hints_after_write<'a>(field: &'a syn::Field,
117
122
/// Returns the field index of the field whose length is specified.
118
123
fn length_prefix_of < ' a > ( field : & ' a syn:: Field ,
119
124
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 > ) > {
121
126
let potential_prefix = field. ident . as_ref ( ) ;
122
127
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| {
124
129
match attr:: protocol ( & potential_prefix_of. attrs ) {
125
130
Some ( attr:: Protocol :: LengthPrefix { ref prefix_field_name, .. } ) => {
126
131
if !fields. clone ( ) . into_iter ( ) . any ( |f| f. ident . as_ref ( ) == Some ( prefix_field_name) ) {
127
132
panic ! ( "length prefix is invalid: there is no sibling field named '{}" , prefix_field_name) ;
128
133
}
129
134
130
135
potential_prefix == Some ( prefix_field_name)
131
- } ,
136
+ }
132
137
_ => false ,
133
138
}
134
139
} ) . collect ( ) ;
135
140
136
141
137
142
prefixes_of. iter ( )
138
143
. 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)
146
148
}
147
- } else {
148
- None
149
+ _ => unreachable ! ( ) ,
149
150
}
150
- } ) . flatten ( ) . collect ( )
151
+ } ) . collect ( )
151
152
}
152
153
153
154
fn write_named_fields ( fields_named : & syn:: FieldsNamed )
@@ -158,7 +159,6 @@ fn write_named_fields(fields_named: &syn::FieldsNamed)
158
159
let update_hints = update_hints_after_write ( field, & fields_named. named ) ;
159
160
let update_hints_fixed = update_hint_fixed_length ( field, & fields_named. named ) ;
160
161
161
- println ! ( "WRITE Hints after " ) ;
162
162
quote ! {
163
163
{
164
164
#update_hints_fixed
@@ -174,7 +174,7 @@ fn write_named_fields(fields_named: &syn::FieldsNamed)
174
174
}
175
175
176
176
fn read_unnamed_fields ( fields_unnamed : & syn:: FieldsUnnamed )
177
- -> TokenStream {
177
+ -> TokenStream {
178
178
let field_initializers: Vec < _ > = fields_unnamed. unnamed . iter ( ) . map ( |field| {
179
179
let field_ty = & field. ty ;
180
180
@@ -191,7 +191,7 @@ fn read_unnamed_fields(fields_unnamed: &syn::FieldsUnnamed)
191
191
}
192
192
193
193
fn write_unnamed_fields ( fields_unnamed : & syn:: FieldsUnnamed )
194
- -> TokenStream {
194
+ -> TokenStream {
195
195
let field_indices = ( 0 ..fields_unnamed. unnamed . len ( ) ) . into_iter ( ) . map ( syn:: Index :: from) ;
196
196
197
197
let field_writers: Vec < _ > = field_indices. map ( |field_index| {
0 commit comments