in starlark_derive/src/render.rs [238:296]
fn render_binding(x: &StarFun) -> TokenStream {
let span = x.args_span();
match x.source {
StarFunSource::Parameters => {
let StarArg {
span,
attrs,
name,
ty,
..
} = &x.args[0];
let span = *span;
quote_spanned! { span=> #( #attrs )* let #name : #ty = __args; }
}
StarFunSource::ThisParameters => {
let StarArg {
span,
attrs,
name,
ty,
..
} = &x.args[1];
let span = *span;
let this = render_binding_arg(&x.args[0]);
quote_spanned! {
span=>
#this
#( #attrs )* let #name : #ty = __args;
}
}
StarFunSource::Argument(arg_count) => {
let bind_args = x.args.map(render_binding_arg);
quote_spanned! {
span=>
let __args: [_; #arg_count] = __signature.collect_into(__args, eval.heap())?;
#( #bind_args )*
}
}
StarFunSource::Positional(required, optional) => {
let bind_args = x.args.map(render_binding_arg);
if optional == 0 {
quote_spanned! {
span=>
__args.no_named_args()?;
let __required: [_; #required] = __args.positional(eval.heap())?;
#( #bind_args )*
}
} else {
quote_spanned! {
span=>
__args.no_named_args()?;
let (__required, __optional): ([_; #required], [_; #optional]) = __args.optional(eval.heap())?;
#( #bind_args )*
}
}
}
ref s => unreachable!("Unknown StarFunSource: {:?}", s),
}
}