precise setter function calling in case more than 1 trait is implemented (collision)

This commit is contained in:
Janis 2023-06-26 12:56:00 +02:00
parent 5b8ec05589
commit 2b8d3942da

View file

@ -590,14 +590,16 @@ pub mod rust {
fn generate_struct_ctor( fn generate_struct_ctor(
&self, &self,
_class: &Class, _class: &Class,
_name: &str, type_name: &str,
fields: &Vec<(&ClassField, Cow<str>, String)>, fields: &Vec<(&ClassField, Cow<str>, String)>,
) -> TokenStream { ) -> TokenStream {
let fields_defs = fields.iter().map(|(_, name, ty)| quote! {#name: #ty}); let fields_defs = fields.iter().map(|(_, name, ty)| quote! {#name: #ty});
let this_field_asignments = fields.iter().map(|(_, name, _ty)| { let this_field_asignments = fields.iter().map(|(_, name, _ty)| {
let setter = format_ident!("set_{}", name); let setter = format_ident!("set_{}", name);
quote! {this.#setter(#name);} let field_trait = format_ident!("{type_name}Fields");
quote! {<Self as #field_trait>::#setter(this, #name);}
}); });
// FIXME: handle super struct fields aswell, ARK doesnt seem to have those anyways. // FIXME: handle super struct fields aswell, ARK doesnt seem to have those anyways.
@ -696,8 +698,6 @@ pub mod rust {
impl #method_trait for #name {} impl #method_trait for #name {}
}; };
// TODO: impl super-type fields and methods.
let mut sup = class.super_class; let mut sup = class.super_class;
let super_traits = core::iter::from_fn(|| { let super_traits = core::iter::from_fn(|| {
if let Some(key) = sup { if let Some(key) = sup {