X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=c-bindings-gen%2Fsrc%2Fmain.rs;h=88258632d81694a9c59be831125c9d60d98c9d24;hb=58802e7143ad99aa5d1a5b0cda3a407101f269f4;hp=49bc77435d024e78e86b081f695c2973a3c8724b;hpb=3f4639631a9c9b80576e0963b13d50320640e0c6;p=ldk-c-bindings diff --git a/c-bindings-gen/src/main.rs b/c-bindings-gen/src/main.rs index 49bc774..8825863 100644 --- a/c-bindings-gen/src/main.rs +++ b/c-bindings-gen/src/main.rs @@ -597,7 +597,16 @@ fn writeln_trait<'a, 'b, W: std::io::Write>(w: &mut W, t: &'a syn::ItemTrait, ty (s, i) => { if let Some(supertrait) = types.crate_types.traits.get(s) { let resolver = get_module_type_resolver!(s, types.crate_libs, types.crate_types); - writeln!(w, "impl {} for {} {{", s, trait_name).unwrap(); + + // Blindly assume that the same imports where `supertrait` is defined are also + // imported here. This will almost certainly break at some point, but it should be + // a compilation failure when it does so. + write!(w, "impl").unwrap(); + maybe_write_lifetime_generics(w, &supertrait.generics, types); + write!(w, " {}", s).unwrap(); + maybe_write_generics(w, &supertrait.generics, types, false); + writeln!(w, " for {} {{", trait_name).unwrap(); + impl_trait_for_c!(supertrait, format!(".{}", i), &resolver); writeln!(w, "}}").unwrap(); } else { @@ -1601,15 +1610,15 @@ fn writeln_enum<'a, 'b, W: std::io::Write>(w: &mut W, e: &'a syn::ItemEnum, type writeln_field_docs(w, &field.attrs, "\t\t", types, Some(&gen_types), &field.ty); write!(w, "\t\t{}: ", field.ident.as_ref().unwrap()).unwrap(); write!(&mut constr, "{}{}: ", if idx != 0 { ", " } else { "" }, field.ident.as_ref().unwrap()).unwrap(); - types.write_c_type(w, &field.ty, Some(&gen_types), false); - types.write_c_type(&mut constr, &field.ty, Some(&gen_types), false); + types.write_c_type(w, &field.ty, Some(&gen_types), true); + types.write_c_type(&mut constr, &field.ty, Some(&gen_types), true); writeln!(w, ",").unwrap(); } write!(w, "\t}}").unwrap(); } else if let syn::Fields::Unnamed(fields) = &var.fields { if fields.unnamed.len() == 1 { let mut empty_check = Vec::new(); - types.write_c_type(&mut empty_check, &fields.unnamed[0].ty, Some(&gen_types), false); + types.write_c_type(&mut empty_check, &fields.unnamed[0].ty, Some(&gen_types), true); if empty_check.is_empty() { empty_tuple_variant = true; } @@ -1620,8 +1629,8 @@ fn writeln_enum<'a, 'b, W: std::io::Write>(w: &mut W, e: &'a syn::ItemEnum, type for (idx, field) in fields.unnamed.iter().enumerate() { if export_status(&field.attrs) == ExportStatus::TestOnly { continue; } write!(&mut constr, "{}: ", ('a' as u8 + idx as u8) as char).unwrap(); - types.write_c_type(w, &field.ty, Some(&gen_types), false); - types.write_c_type(&mut constr, &field.ty, Some(&gen_types), false); + types.write_c_type(w, &field.ty, Some(&gen_types), true); + types.write_c_type(&mut constr, &field.ty, Some(&gen_types), true); if idx != fields.unnamed.len() - 1 { write!(w, ",").unwrap(); write!(&mut constr, ",").unwrap(); @@ -1670,7 +1679,7 @@ fn writeln_enum<'a, 'b, W: std::io::Write>(w: &mut W, e: &'a syn::ItemEnum, type } else if let syn::Fields::Unnamed(fields) = &var.fields { if fields.unnamed.len() == 1 { let mut empty_check = Vec::new(); - types.write_c_type(&mut empty_check, &fields.unnamed[0].ty, Some(&gen_types), false); + types.write_c_type(&mut empty_check, &fields.unnamed[0].ty, Some(&gen_types), true); if empty_check.is_empty() { empty_tuple_variant = true; }