From: Matt Corallo Date: Thu, 31 Dec 2020 16:14:22 +0000 (-0500) Subject: [bindings] Don't require trait impl for-structs to have no generics X-Git-Tag: v0.0.13~37^2~7 X-Git-Url: http://git.bitcoin.ninja/?a=commitdiff_plain;h=ac078c103c64f19a70f7967dce620a1905397426;p=rust-lightning [bindings] Don't require trait impl for-structs to have no generics This (finally) exposes `ChannelManager`/`ChannelMonitor` _write methods, which were (needlessly) excluded as the structs themselves have generic parameters. Sadly, we also now need to parse `(C-not exported)` doc comments on impl blocks as we otherwise try to expose _write methods for `&Vec`, which doesn't work (and isn't particularly interesting for users anyway). We add such doc comments there. --- diff --git a/c-bindings-gen/src/main.rs b/c-bindings-gen/src/main.rs index ffb70f920..4cd3ff557 100644 --- a/c-bindings-gen/src/main.rs +++ b/c-bindings-gen/src/main.rs @@ -65,7 +65,7 @@ fn maybe_convert_trait_impl(w: &mut W, trait_path: &syn::Path let full_obj_path; let mut has_inner = false; if let syn::Type::Path(ref p) = for_ty { - if let Some(ident) = p.path.get_ident() { + if let Some(ident) = single_ident_generic_path_to_ident(&p.path) { for_obj = format!("{}", ident); full_obj_path = for_obj.clone(); has_inner = types.c_type_has_inner_from_path(&types.resolve_path(&p.path, Some(generics))); @@ -706,6 +706,11 @@ fn writeln_struct<'a, 'b, W: std::io::Write>(w: &mut W, s: &'a syn::ItemStruct, /// /// A few non-crate Traits are hard-coded including Default. fn writeln_impl(w: &mut W, i: &syn::ItemImpl, types: &mut TypeResolver) { + match export_status(&i.attrs) { + ExportStatus::Export => {}, + ExportStatus::NoExport|ExportStatus::TestOnly => return, + } + if let syn::Type::Tuple(_) = &*i.self_ty { if types.understood_c_type(&*i.self_ty, None) { let mut gen_types = GenericTypes::new(); @@ -952,10 +957,9 @@ fn writeln_impl(w: &mut W, i: &syn::ItemImpl, types: &mut Typ }, "PartialEq" => {}, // If we have no generics, try a manual implementation: - _ if p.path.get_ident().is_some() => maybe_convert_trait_impl(w, &trait_path.1, &*i.self_ty, types, &gen_types), - _ => {}, + _ => maybe_convert_trait_impl(w, &trait_path.1, &*i.self_ty, types, &gen_types), } - } else if p.path.get_ident().is_some() { + } else { // If we have no generics, try a manual implementation: maybe_convert_trait_impl(w, &trait_path.1, &*i.self_ty, types, &gen_types); } diff --git a/lightning/src/ln/chan_utils.rs b/lightning/src/ln/chan_utils.rs index 2ccee7b2d..b1171f543 100644 --- a/lightning/src/ln/chan_utils.rs +++ b/lightning/src/ln/chan_utils.rs @@ -843,6 +843,7 @@ impl PartialEq for CommitmentTransaction { } } +/// (C-not exported) as users never need to call this directly impl Writeable for Vec { #[inline] fn write(&self, w: &mut W) -> Result<(), ::std::io::Error> { @@ -854,6 +855,7 @@ impl Writeable for Vec { } } +/// (C-not exported) as users never need to call this directly impl Readable for Vec { #[inline] fn read(r: &mut R) -> Result { diff --git a/lightning/src/routing/router.rs b/lightning/src/routing/router.rs index f73a9a501..32084fad5 100644 --- a/lightning/src/routing/router.rs +++ b/lightning/src/routing/router.rs @@ -45,6 +45,7 @@ pub struct RouteHop { pub cltv_expiry_delta: u32, } +/// (C-not exported) impl Writeable for Vec { fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { (self.len() as u8).write(writer)?; @@ -60,6 +61,7 @@ impl Writeable for Vec { } } +/// (C-not exported) impl Readable for Vec { fn read(reader: &mut R) -> Result, DecodeError> { let hops_count: u8 = Readable::read(reader)?;