Support traits with lifetime bounds (which are ignored)
[ldk-c-bindings] / c-bindings-gen / src / main.rs
index 1bcc8f19731f435fb5e91a8e57625d4adff3f759..961669448fa8b39884c49eec895bfb9d275f1664 100644 (file)
@@ -482,13 +482,18 @@ fn writeln_trait<'a, 'b, W: std::io::Write>(w: &mut W, t: &'a syn::ItemTrait, ty
                                        &syn::TraitItem::Type(ref t) => {
                                                if t.default.is_some() || t.generics.lt_token.is_some() { unimplemented!(); }
                                                let mut bounds_iter = t.bounds.iter();
-                                               match bounds_iter.next().unwrap() {
-                                                       syn::TypeParamBound::Trait(tr) => {
-                                                               writeln!(w, "\ttype {} = crate::{};", t.ident, $type_resolver.resolve_path(&tr.path, Some(&gen_types))).unwrap();
-                                                       },
-                                                       _ => unimplemented!(),
+                                               loop {
+                                                       match bounds_iter.next().unwrap() {
+                                                               syn::TypeParamBound::Trait(tr) => {
+                                                                       writeln!(w, "\ttype {} = crate::{};", t.ident, $type_resolver.resolve_path(&tr.path, Some(&gen_types))).unwrap();
+                                                                       for bound in bounds_iter {
+                                                                               if let syn::TypeParamBound::Trait(_) = bound { unimplemented!(); }
+                                                                       }
+                                                                       break;
+                                                               },
+                                                               syn::TypeParamBound::Lifetime(_) => {},
+                                                       }
                                                }
-                                               if bounds_iter.next().is_some() { unimplemented!(); }
                                        },
                                        _ => unimplemented!(),
                                }
@@ -670,7 +675,7 @@ fn writeln_struct<'a, 'b, W: std::io::Write>(w: &mut W, s: &'a syn::ItemStruct,
                                                write!(w, "#[no_mangle]\npub extern \"C\" fn {}_get_{}(this_ptr: &{}) -> ", struct_name, $new_name, struct_name).unwrap();
                                                types.write_c_type(w, &ref_type, Some(&gen_types), true);
                                                write!(w, " {{\n\tlet mut inner_val = &mut this_ptr.get_native_mut_ref().{};\n\t", $real_name).unwrap();
-                                               let local_var = types.write_to_c_conversion_new_var(w, &format_ident!("inner_val"), &ref_type, Some(&gen_types), true);
+                                               let local_var = types.write_to_c_conversion_from_ownable_ref_new_var(w, &format_ident!("inner_val"), &ref_type, Some(&gen_types));
                                                if local_var { write!(w, "\n\t").unwrap(); }
                                                types.write_to_c_conversion_inline_prefix(w, &ref_type, Some(&gen_types), true);
                                                write!(w, "inner_val").unwrap();