@@ -49,10 +49,10 @@ pub fn make_function_definition_with_defaults(
49
49
let receiver_param = & code. receiver . param ;
50
50
let receiver_self = & code. receiver . self_prefix ;
51
51
52
- let [ required_params_impl_asarg, _, required_args_asarg ] =
52
+ let [ required_params_impl_asarg, _, _ ] =
53
53
functions_common:: make_params_exprs ( required_fn_params. iter ( ) . cloned ( ) , false , true , true ) ;
54
54
55
- let [ required_params_plain , _, required_args_internal] =
55
+ let [ _ , _, required_args_internal] =
56
56
functions_common:: make_params_exprs ( required_fn_params. into_iter ( ) , false , false , false ) ;
57
57
58
58
let return_decl = & sig. return_value ( ) . decl ;
@@ -78,7 +78,7 @@ pub fn make_function_definition_with_defaults(
78
78
impl #builder_lifetime #builder_ty #builder_lifetime {
79
79
fn new(
80
80
#object_param
81
- #( #required_params_plain , ) *
81
+ #( #required_params_impl_asarg , ) *
82
82
) -> Self {
83
83
Self {
84
84
#( #builder_inits, ) *
@@ -114,7 +114,7 @@ pub fn make_function_definition_with_defaults(
114
114
) -> #builder_ty #builder_anon_lifetime {
115
115
#builder_ty:: new(
116
116
#object_arg
117
- #( #required_args_asarg , ) *
117
+ #( #required_args_internal , ) *
118
118
)
119
119
}
120
120
} ;
@@ -247,26 +247,33 @@ fn make_extender(
247
247
default_value,
248
248
} = param;
249
249
250
- let ( field_type, needs_conversion) = type_. private_field_decl ( ) ;
250
+ let ( field_type, needs_conversion) = type_. default_extender_field_decl ( ) ;
251
251
252
252
// Initialize with default parameters where available, forward constructor args otherwise
253
253
let init = if let Some ( value) = default_value {
254
- make_field_init ( name, value, needs_conversion)
254
+ make_field_init ( name, Some ( value) , needs_conversion)
255
255
} else {
256
- quote ! { #name }
256
+ //quote! { #name }
257
+ make_field_init ( name, None , needs_conversion)
258
+ } ;
259
+
260
+ let builder_arg = if needs_conversion {
261
+ quote ! { self . #name. cow_as_object_arg( ) }
262
+ } else {
263
+ quote ! { self . #name }
257
264
} ;
258
265
259
266
result. builder_fields . push ( quote ! { #name: #field_type } ) ;
260
- result. builder_args . push ( quote ! { self . #name } ) ;
267
+ result. builder_args . push ( builder_arg ) ;
261
268
result. builder_inits . push ( init) ;
262
269
}
263
270
264
271
for param in default_fn_params {
265
272
let FnParam { name, type_, .. } = param;
266
273
let param_type = type_. param_decl ( ) ;
267
- let ( _, field_needs_conversion) = type_. private_field_decl ( ) ;
274
+ let ( _, field_needs_conversion) = type_. default_extender_field_decl ( ) ;
268
275
269
- let field_init = make_field_init ( name, & quote ! { value } , field_needs_conversion) ;
276
+ let field_init = make_field_init ( name, Some ( & quote ! { value } ) , field_needs_conversion) ;
270
277
271
278
let method = quote ! {
272
279
#[ inline]
@@ -285,10 +292,16 @@ fn make_extender(
285
292
result
286
293
}
287
294
288
- fn make_field_init ( name : & Ident , expr : & TokenStream , needs_conversion : bool ) -> TokenStream {
289
- if needs_conversion {
290
- quote ! { #name: #expr. as_object_arg( ) }
291
- } else {
292
- quote ! { #name: #expr }
295
+ // Rewrite the above using match
296
+ fn make_field_init (
297
+ name : & Ident ,
298
+ expr : Option < & TokenStream > , // None if the parameter has the same name as the field, and can use shorthand syntax.
299
+ needs_conversion : bool ,
300
+ ) -> TokenStream {
301
+ match ( needs_conversion, expr) {
302
+ ( true , Some ( expr) ) => quote ! { #name: #expr. consume_object( ) } ,
303
+ ( true , None ) /*. */ => quote ! { #name: #name. consume_object( ) } ,
304
+ ( false , Some ( expr) ) => quote ! { #name: #expr } ,
305
+ ( false , None ) /*. */ => quote ! { #name } ,
293
306
}
294
307
}
0 commit comments