in cppwinrt/code_writers.h [624:710]
static void write_abi_args(writer& w, method_signature const& method_signature)
{
separator s{ w };
for (auto&& [param, param_signature] : method_signature.params())
{
s();
auto param_name = param.Name();
TypeDef signature_type;
auto category = get_category(param_signature->Type(), &signature_type);
if (param.Flags().In())
{
switch (category)
{
case param_category::object_type:
case param_category::string_type:
w.write("*(void**)(&%)", param_name);
break;
case param_category::generic_type:
case param_category::struct_type:
w.write("impl::bind_in(%)", param_name);
break;
case param_category::enum_type:
w.write("static_cast<%>(%)", signature_type.FieldList().first.Signature().Type(), param_name);
break;
case param_category::fundamental_type:
w.write(param_name);
break;
case param_category::array_type:
w.write("%.size(), get_abi(%)", param_name, param_name);
break;
}
}
else
{
switch (category)
{
case param_category::fundamental_type:
w.write("&%", param_name);
break;
case param_category::enum_type:
w.write("reinterpret_cast<%*>(&%)", signature_type.FieldList().first.Signature().Type(), param_name);
break;
case param_category::array_type:
if (param_signature->ByRef())
{
w.write("impl::put_size_abi(%), put_abi(%)", param_name, param_name);
}
else
{
w.write("%.size(), put_abi(%)", param_name, param_name);
}
break;
default:
w.write("impl::bind_out(%)", param_name);
break;
}
}
}
if (method_signature.return_signature())
{
s();
auto param_name = method_signature.return_param_name();
TypeDef signature_type;
auto category = get_category(method_signature.return_signature().Type(), &signature_type);
if (category == param_category::array_type)
{
w.write("&%_impl_size, &%", param_name, param_name);
}
else if (category == param_category::struct_type || category == param_category::generic_type)
{
w.write("put_abi(%)", param_name);
}
else if (category == param_category::enum_type)
{
w.write("reinterpret_cast<%*>(&%)", signature_type.FieldList().first.Signature().Type(), param_name);
}
else
{
w.write("&%", param_name);
}
}
}