X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=c-bindings-gen%2Fsrc%2Ftypes.rs;h=483c1d9b9d12821b427cf8e0e143a56abb9a2400;hb=304471b1c185ed25ce8fdefa51fdfc5844caf94e;hp=3fc35e8b2558f8de6f7da2d4d017664a8b3390d1;hpb=8f10a1d33d8c4ec38cc39c9e013da24386e13f85;p=rust-lightning diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 3fc35e8b..483c1d9b 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -932,19 +932,34 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { // *** Original Rust Type Printing *** // *********************************** - fn write_rust_path(&self, w: &mut W, path: &syn::Path) { - if let Some(resolved) = self.maybe_resolve_path(&path, None) { + fn in_rust_prelude(resolved_path: &str) -> bool { + match resolved_path { + "Vec" => true, + "Result" => true, + "Option" => true, + _ => false, + } + } + + fn write_rust_path(&self, w: &mut W, generics_resolver: Option<&GenericTypes>, path: &syn::Path) { + if let Some(resolved) = self.maybe_resolve_path(&path, generics_resolver) { if self.is_primitive(&resolved) { write!(w, "{}", path.get_ident().unwrap()).unwrap(); } else { - if resolved.starts_with("ln::") || resolved.starts_with("chain::") || resolved.starts_with("util::") { - write!(w, "lightning::{}", resolved).unwrap(); + // TODO: We should have a generic "is from a dependency" check here instead of + // checking for "bitcoin" explicitly. + if resolved.starts_with("bitcoin::") || Self::in_rust_prelude(&resolved) { + write!(w, "{}", resolved).unwrap(); + // If we're printing a generic argument, it needs to reference the crate, otherwise + // the original crate: + } else if self.maybe_resolve_path(&path, None).as_ref() == Some(&resolved) { + write!(w, "{}::{}", self.orig_crate, resolved).unwrap(); } else { - write!(w, "{}", resolved).unwrap(); // XXX: Probably doens't work, get_ident().unwrap() + write!(w, "crate::{}", resolved).unwrap(); } } if let syn::PathArguments::AngleBracketed(args) = &path.segments.iter().last().unwrap().arguments { - self.write_rust_generic_arg(w, args.args.iter()); + self.write_rust_generic_arg(w, generics_resolver, args.args.iter()); } } else { if path.leading_colon.is_some() { @@ -954,12 +969,12 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if idx != 0 { write!(w, "::").unwrap(); } write!(w, "{}", seg.ident).unwrap(); if let syn::PathArguments::AngleBracketed(args) = &seg.arguments { - self.write_rust_generic_arg(w, args.args.iter()); + self.write_rust_generic_arg(w, generics_resolver, args.args.iter()); } } } } - pub fn write_rust_generic_param<'b, W: std::io::Write>(&self, w: &mut W, generics: impl Iterator) { + pub fn write_rust_generic_param<'b, W: std::io::Write>(&self, w: &mut W, generics_resolver: Option<&GenericTypes>, generics: impl Iterator) { let mut had_params = false; for (idx, arg) in generics.enumerate() { if idx != 0 { write!(w, ", ").unwrap(); } else { write!(w, "<").unwrap(); } @@ -974,7 +989,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { match bound { syn::TypeParamBound::Trait(tb) => { if tb.paren_token.is_some() || tb.lifetimes.is_some() { unimplemented!(); } - self.write_rust_path(w, &tb.path); + self.write_rust_path(w, generics_resolver, &tb.path); }, _ => unimplemented!(), } @@ -987,24 +1002,24 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if had_params { write!(w, ">").unwrap(); } } - pub fn write_rust_generic_arg<'b, W: std::io::Write>(&self, w: &mut W, generics: impl Iterator) { + pub fn write_rust_generic_arg<'b, W: std::io::Write>(&self, w: &mut W, generics_resolver: Option<&GenericTypes>, generics: impl Iterator) { write!(w, "<").unwrap(); for (idx, arg) in generics.enumerate() { if idx != 0 { write!(w, ", ").unwrap(); } match arg { - syn::GenericArgument::Type(t) => self.write_rust_type(w, t), + syn::GenericArgument::Type(t) => self.write_rust_type(w, generics_resolver, t), _ => unimplemented!(), } } write!(w, ">").unwrap(); } - pub fn write_rust_type(&self, w: &mut W, t: &syn::Type) { + pub fn write_rust_type(&self, w: &mut W, generics: Option<&GenericTypes>, t: &syn::Type) { match t { syn::Type::Path(p) => { if p.qself.is_some() || p.path.leading_colon.is_some() { unimplemented!(); } - self.write_rust_path(w, &p.path); + self.write_rust_path(w, generics, &p.path); }, syn::Type::Reference(r) => { write!(w, "&").unwrap(); @@ -1014,11 +1029,11 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if r.mutability.is_some() { write!(w, "mut ").unwrap(); } - self.write_rust_type(w, &*r.elem); + self.write_rust_type(w, generics, &*r.elem); }, syn::Type::Array(a) => { write!(w, "[").unwrap(); - self.write_rust_type(w, &a.elem); + self.write_rust_type(w, generics, &a.elem); if let syn::Expr::Lit(l) = &a.len { if let syn::Lit::Int(i) = &l.lit { write!(w, "; {}]", i).unwrap(); @@ -1027,14 +1042,14 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { } syn::Type::Slice(s) => { write!(w, "[").unwrap(); - self.write_rust_type(w, &s.elem); + self.write_rust_type(w, generics, &s.elem); write!(w, "]").unwrap(); }, syn::Type::Tuple(s) => { write!(w, "(").unwrap(); for (idx, t) in s.elems.iter().enumerate() { if idx != 0 { write!(w, ", ").unwrap(); } - self.write_rust_type(w, &t); + self.write_rust_type(w, generics, &t); } write!(w, ")").unwrap(); }, @@ -1743,7 +1758,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { } else if in_crate { write!(w, "{}", c_type).unwrap(); } else { - self.write_rust_type(w, &t); + self.write_rust_type(w, None, &t); } } else { // If we just write out resolved_generic, it may mostly work, however for