@@ -149,16 +149,90 @@ fn gen_debug_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
149
149
let mut arms = vec ! [ ] ;
150
150
for variant in list. variants ( ) {
151
151
let name = variant. name ( ) ?;
152
- let variant_name =
153
- make:: path_pat ( make:: ext:: path_from_idents ( [ "Self" , & format ! ( "{}" , name) ] ) ?) ;
154
-
152
+ let variant_name = make:: ext:: path_from_idents ( [ "Self" , & format ! ( "{}" , name) ] ) ?;
155
153
let target = make:: expr_path ( make:: ext:: ident_path ( "f" ) . into ( ) ) ;
156
- let fmt_string = make:: expr_literal ( & ( format ! ( "\" {}\" " , name) ) ) . into ( ) ;
157
- let args = make:: arg_list ( vec ! [ target, fmt_string] ) ;
158
- let macro_name = make:: expr_path ( make:: ext:: ident_path ( "write" ) ) ;
159
- let macro_call = make:: expr_macro_call ( macro_name, args) ;
160
154
161
- arms. push ( make:: match_arm ( Some ( variant_name. into ( ) ) , None , macro_call. into ( ) ) ) ;
155
+ match variant. field_list ( ) {
156
+ Some ( ast:: FieldList :: RecordFieldList ( list) ) => {
157
+ // => f.debug_struct(name)
158
+ let target = make:: expr_path ( make:: ext:: ident_path ( "f" ) ) ;
159
+ let method = make:: name_ref ( "debug_struct" ) ;
160
+ let struct_name = format ! ( "\" {}\" " , name) ;
161
+ let args = make:: arg_list ( Some ( make:: expr_literal ( & struct_name) . into ( ) ) ) ;
162
+ let mut expr = make:: expr_method_call ( target, method, args) ;
163
+
164
+ let mut pats = vec ! [ ] ;
165
+ for field in list. fields ( ) {
166
+ let field_name = field. name ( ) ?;
167
+
168
+ // create a field pattern for use in `MyStruct { fields.. }`
169
+ let pat = make:: ident_pat ( false , false , field_name. clone ( ) ) ;
170
+ pats. push ( pat. into ( ) ) ;
171
+
172
+ // => <expr>.field("field_name", field)
173
+ let method_name = make:: name_ref ( "field" ) ;
174
+ let name = make:: expr_literal ( & ( format ! ( "\" {}\" " , field_name) ) ) . into ( ) ;
175
+ let path = & format ! ( "{}" , field_name) ;
176
+ let path = make:: expr_path ( make:: ext:: ident_path ( path) ) ;
177
+ let args = make:: arg_list ( vec ! [ name, path] ) ;
178
+ expr = make:: expr_method_call ( expr, method_name, args) ;
179
+ }
180
+
181
+ // => <expr>.finish()
182
+ let method = make:: name_ref ( "finish" ) ;
183
+ let expr = make:: expr_method_call ( expr, method, make:: arg_list ( None ) ) ;
184
+
185
+ // => MyStruct { fields.. } => f.debug_struct("MyStruct")...finish(),
186
+ let pat = make:: record_pat ( variant_name. clone ( ) , pats. into_iter ( ) ) ;
187
+ arms. push ( make:: match_arm ( Some ( pat. into ( ) ) , None , expr) ) ;
188
+ }
189
+ Some ( ast:: FieldList :: TupleFieldList ( list) ) => {
190
+ // => f.debug_tuple(name)
191
+ let target = make:: expr_path ( make:: ext:: ident_path ( "f" ) ) ;
192
+ let method = make:: name_ref ( "debug_tuple" ) ;
193
+ let struct_name = format ! ( "\" {}\" " , name) ;
194
+ let args = make:: arg_list ( Some ( make:: expr_literal ( & struct_name) . into ( ) ) ) ;
195
+ let mut expr = make:: expr_method_call ( target, method, args) ;
196
+
197
+ let mut pats = vec ! [ ] ;
198
+ for ( i, _) in list. fields ( ) . enumerate ( ) {
199
+ let name = format ! ( "arg{}" , i) ;
200
+
201
+ // create a field pattern for use in `MyStruct(fields..)`
202
+ let field_name = make:: name ( & name) ;
203
+ let pat = make:: ident_pat ( false , false , field_name. clone ( ) ) ;
204
+ pats. push ( pat. into ( ) ) ;
205
+
206
+ // => <expr>.field(field)
207
+ let method_name = make:: name_ref ( "field" ) ;
208
+ let field_path = & format ! ( "{}" , name) ;
209
+ let field_path = make:: expr_path ( make:: ext:: ident_path ( field_path) ) ;
210
+ let args = make:: arg_list ( vec ! [ field_path] ) ;
211
+ expr = make:: expr_method_call ( expr, method_name, args) ;
212
+ }
213
+
214
+ // => <expr>.finish()
215
+ let method = make:: name_ref ( "finish" ) ;
216
+ let expr = make:: expr_method_call ( expr, method, make:: arg_list ( None ) ) ;
217
+
218
+ // => MyStruct (fields..) => f.debug_tuple("MyStruct")...finish(),
219
+ let pat = make:: tuple_struct_pat ( variant_name. clone ( ) , pats. into_iter ( ) ) ;
220
+ arms. push ( make:: match_arm ( Some ( pat. into ( ) ) , None , expr) ) ;
221
+ }
222
+ None => {
223
+ let fmt_string = make:: expr_literal ( & ( format ! ( "\" {}\" " , name) ) ) . into ( ) ;
224
+ let args = make:: arg_list ( [ target, fmt_string] ) ;
225
+ let macro_name = make:: expr_path ( make:: ext:: ident_path ( "write" ) ) ;
226
+ let macro_call = make:: expr_macro_call ( macro_name, args) ;
227
+
228
+ let variant_name = make:: path_pat ( variant_name) ;
229
+ arms. push ( make:: match_arm (
230
+ Some ( variant_name. into ( ) ) ,
231
+ None ,
232
+ macro_call. into ( ) ,
233
+ ) ) ;
234
+ }
235
+ }
162
236
}
163
237
164
238
let match_target = make:: expr_path ( make:: ext:: ident_path ( "self" ) ) ;
@@ -190,7 +264,7 @@ fn gen_debug_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
190
264
let f_path = make:: expr_path ( make:: ext:: ident_path ( "self" ) ) ;
191
265
let f_path = make:: expr_ref ( f_path, false ) ;
192
266
let f_path = make:: expr_field ( f_path, & format ! ( "{}" , name) ) . into ( ) ;
193
- let args = make:: arg_list ( vec ! [ f_name, f_path] ) ;
267
+ let args = make:: arg_list ( [ f_name, f_path] ) ;
194
268
expr = make:: expr_method_call ( expr, make:: name_ref ( "field" ) , args) ;
195
269
}
196
270
expr
0 commit comments