}
writeln_docs(w, &t.attrs, "");
- let mut gen_types = GenericTypes::new();
+ let mut gen_types = GenericTypes::new(None);
assert!(gen_types.learn_generics(&t.generics, types));
gen_types.learn_associated_types(&t, types);
writeln_opaque(w, &s.ident, struct_name, &s.generics, &s.attrs, types, extra_headers, cpp_headers);
if let syn::Fields::Named(fields) = &s.fields {
- let mut gen_types = GenericTypes::new();
+ let mut self_path_segs = syn::punctuated::Punctuated::new();
+ self_path_segs.push(s.ident.clone().into());
+ let self_path = syn::Path { leading_colon: None, segments: self_path_segs};
+ let mut gen_types = GenericTypes::new(Some((types.resolve_path(&self_path, None), &self_path)));
assert!(gen_types.learn_generics(&s.generics, types));
let mut all_fields_settable = true;
if let syn::Type::Tuple(_) = &*i.self_ty {
if types.understood_c_type(&*i.self_ty, None) {
- let mut gen_types = GenericTypes::new();
+ let mut gen_types = GenericTypes::new(None);
if !gen_types.learn_generics(&i.generics, types) {
eprintln!("Not implementing anything for `impl (..)` due to not understood generics");
return;
if p.qself.is_some() { unimplemented!(); }
if let Some(ident) = single_ident_generic_path_to_ident(&p.path) {
if let Some(resolved_path) = types.maybe_resolve_non_ignored_ident(&ident) {
- let mut gen_types = GenericTypes::new();
+ let mut gen_types = GenericTypes::new(Some((resolved_path.clone(), &p.path)));
if !gen_types.learn_generics(&i.generics, types) {
eprintln!("Not implementing anything for impl {} due to not understood generics", ident);
return;
write_method_var_decl_body(w, &m.sig, "", types, Some(&meth_gen_types), false);
let mut takes_self = false;
let mut takes_mut_self = false;
+ let mut takes_owned_self = false;
for inp in m.sig.inputs.iter() {
if let syn::FnArg::Receiver(r) = inp {
takes_self = true;
if r.mutability.is_some() { takes_mut_self = true; }
+ if r.reference.is_none() { takes_owned_self = true; }
}
}
- if takes_mut_self {
- write!(w, "unsafe {{ &mut (*(this_arg.inner as *mut native{})) }}.{}(", ident, m.sig.ident).unwrap();
- } else if takes_self {
- write!(w, "unsafe {{ &*this_arg.inner }}.{}(", m.sig.ident).unwrap();
- } else {
+ if !takes_mut_self && !takes_self {
write!(w, "{}::{}(", resolved_path, m.sig.ident).unwrap();
+ } else {
+ match &declared_type {
+ DeclType::MirroredEnum => write!(w, "this_arg.to_native().{}(", m.sig.ident).unwrap(),
+ DeclType::StructImported => {
+ if takes_owned_self {
+ write!(w, "(*unsafe {{ Box::from_raw(this_arg.take_inner()) }}).{}(", m.sig.ident).unwrap();
+ } else if takes_mut_self {
+ write!(w, "unsafe {{ &mut (*(this_arg.inner as *mut native{})) }}.{}(", ident, m.sig.ident).unwrap();
+ } else {
+ write!(w, "unsafe {{ &*this_arg.inner }}.{}(", m.sig.ident).unwrap();
+ }
+ },
+ _ => unimplemented!(),
+ }
}
write_method_call_params(w, &m.sig, "", types, Some(&meth_gen_types), &ret_type, false);
writeln!(w, "\n}}\n").unwrap();
}
writeln_docs(w, &f.attrs, "");
- let mut gen_types = GenericTypes::new();
+ let mut gen_types = GenericTypes::new(None);
if !gen_types.learn_generics(&f.sig.generics, types) { return; }
write!(w, "#[no_mangle]\npub extern \"C\" fn {}(", f.sig.ident).unwrap();