Skip to content

Commit 9af6a86

Browse files
committed
Small refactor: FnParamTokens
1 parent 3981f04 commit 9af6a86

File tree

2 files changed

+51
-36
lines changed

2 files changed

+51
-36
lines changed

godot-codegen/src/generator/default_parameters.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77

88
use crate::generator::functions_common;
9-
use crate::generator::functions_common::FnCode;
9+
use crate::generator::functions_common::{FnCode, FnParamTokens};
1010
use crate::models::domain::{FnParam, FnQualifier, Function, RustTy, TyName};
1111
use crate::util::{ident, safe_ident};
1212
use crate::{conv, special_cases};
@@ -49,11 +49,15 @@ pub fn make_function_definition_with_defaults(
4949
let receiver_param = &code.receiver.param;
5050
let receiver_self = &code.receiver.self_prefix;
5151

52-
let [required_params_impl_asarg, _, _] =
53-
functions_common::make_params_exprs(required_fn_params.iter().cloned(), true, true);
52+
let FnParamTokens {
53+
params: required_params_impl_asarg,
54+
..
55+
} = functions_common::make_params_exprs(required_fn_params.iter().cloned(), true, true);
5456

55-
let [_, _, required_args_internal] =
56-
functions_common::make_params_exprs(required_fn_params.into_iter(), false, false);
57+
let FnParamTokens {
58+
arg_names: required_args_internal,
59+
..
60+
} = functions_common::make_params_exprs(required_fn_params.into_iter(), false, false);
5761

5862
let return_decl = &sig.return_value().decl;
5963

godot-codegen/src/generator/functions_common.rs

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::generator::default_parameters;
99
use crate::models::domain::{FnParam, FnQualifier, Function, RustTy};
1010
use crate::special_cases;
1111
use crate::util::safe_ident;
12-
use proc_macro2::TokenStream;
12+
use proc_macro2::{Ident, TokenStream};
1313
use quote::{format_ident, quote};
1414

1515
pub struct FnReceiver {
@@ -84,6 +84,22 @@ impl FnDefinitions {
8484
}
8585
}
8686

87+
// Gathers multiple token vectors related to function parameters.
88+
#[derive(Default)]
89+
pub struct FnParamTokens {
90+
pub params: Vec<TokenStream>,
91+
pub param_types: Vec<TokenStream>,
92+
pub arg_names: Vec<TokenStream>,
93+
}
94+
95+
impl FnParamTokens {
96+
pub fn push_regular(&mut self, param_name: &Ident, param_ty: &RustTy) {
97+
self.params.push(quote! { #param_name: #param_ty });
98+
self.arg_names.push(quote! { #param_name });
99+
self.param_types.push(quote! { #param_ty });
100+
}
101+
}
102+
87103
pub fn make_function_definition(
88104
sig: &dyn Function,
89105
code: &FnCode,
@@ -120,7 +136,11 @@ pub fn make_function_definition(
120136
(TokenStream::new(), TokenStream::new())
121137
};
122138

123-
let [params, param_types, arg_names] = if sig.is_virtual() {
139+
let FnParamTokens {
140+
params,
141+
param_types,
142+
arg_names,
143+
} = if sig.is_virtual() {
124144
make_params_exprs_virtual(sig.params().iter(), sig)
125145
} else {
126146
make_params_exprs(
@@ -204,7 +224,10 @@ pub fn make_function_definition(
204224
// This can be made more complex if ever necessary.
205225

206226
// A function() may call try_function(), its arguments should not have .as_object_arg().
207-
let [_, _, arg_names_without_asarg] = make_params_exprs(
227+
let FnParamTokens {
228+
arg_names: arg_names_without_asarg,
229+
..
230+
} = make_params_exprs(
208231
sig.params().iter(),
209232
!has_default_params, // For *_full function, we don't need impl AsObjectArg<T> parameters
210233
false, // or arg.as_object_arg() calls.
@@ -315,10 +338,8 @@ pub(crate) fn make_params_exprs<'a>(
315338
method_args: impl Iterator<Item = &'a FnParam>,
316339
param_is_impl_asarg: bool,
317340
arg_is_asarg: bool,
318-
) -> [Vec<TokenStream>; 3] {
319-
let mut params = vec![];
320-
let mut param_types = vec![]; // or non-generic params
321-
let mut arg_names = vec![];
341+
) -> FnParamTokens {
342+
let mut ret = FnParamTokens::default();
322343

323344
for param in method_args {
324345
let param_name = &param.name;
@@ -333,41 +354,35 @@ pub(crate) fn make_params_exprs<'a>(
333354
} => {
334355
// Parameter declarations in signature: impl AsObjectArg<T>
335356
if param_is_impl_asarg {
336-
params.push(quote! { #param_name: #impl_as_object_arg });
357+
ret.params.push(quote! { #param_name: #impl_as_object_arg });
337358
} else {
338-
params.push(quote! { #param_name: #object_arg });
359+
ret.params.push(quote! { #param_name: #object_arg });
339360
}
340361

341362
// Argument names in function body: arg.as_object_arg() vs. arg
342363
if arg_is_asarg {
343-
arg_names.push(quote! { #param_name.as_object_arg() });
364+
ret.arg_names.push(quote! { #param_name.as_object_arg() });
344365
} else {
345-
arg_names.push(quote! { #param_name });
366+
ret.arg_names.push(quote! { #param_name });
346367
}
347368

348-
param_types.push(quote! { #object_arg });
369+
ret.param_types.push(quote! { #object_arg });
349370
}
350371

351372
// All other methods and parameter types: standard handling.
352-
_ => {
353-
params.push(quote! { #param_name: #param_ty });
354-
arg_names.push(quote! { #param_name });
355-
param_types.push(quote! { #param_ty });
356-
}
373+
_ => ret.push_regular(param_name, param_ty),
357374
}
358375
}
359376

360-
[params, param_types, arg_names]
377+
ret
361378
}
362379

363380
/// For virtual functions, returns the parameter declarations, type tokens, and names.
364381
pub(crate) fn make_params_exprs_virtual<'a>(
365382
method_args: impl Iterator<Item = &'a FnParam>,
366383
function_sig: &dyn Function,
367-
) -> [Vec<TokenStream>; 3] {
368-
let mut params = vec![];
369-
let mut param_types = vec![]; // or non-generic params
370-
let mut arg_names = vec![];
384+
) -> FnParamTokens {
385+
let mut ret = FnParamTokens::default();
371386

372387
for param in method_args {
373388
let param_name = &param.name;
@@ -382,21 +397,17 @@ pub(crate) fn make_params_exprs_virtual<'a>(
382397
param_name,
383398
) =>
384399
{
385-
params.push(quote! { #param_name: Option<#param_ty> });
386-
arg_names.push(quote! { #param_name });
387-
param_types.push(quote! { #param_ty });
400+
ret.params.push(quote! { #param_name: Option<#param_ty> });
401+
ret.arg_names.push(quote! { #param_name });
402+
ret.param_types.push(quote! { #param_ty });
388403
}
389404

390405
// All other methods and parameter types: standard handling.
391-
_ => {
392-
params.push(quote! { #param_name: #param_ty });
393-
arg_names.push(quote! { #param_name });
394-
param_types.push(quote! { #param_ty });
395-
}
406+
_ => ret.push_regular(param_name, param_ty),
396407
}
397408
}
398409

399-
[params, param_types, arg_names]
410+
ret
400411
}
401412

402413
fn function_uses_pointers(sig: &dyn Function) -> bool {

0 commit comments

Comments
 (0)