projects
/
ldk-c-bindings
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Pass `with_ref_lifetime` through to rust-type-printing from C-path printing
[ldk-c-bindings]
/
c-bindings-gen
/
src
/
types.rs
diff --git
a/c-bindings-gen/src/types.rs
b/c-bindings-gen/src/types.rs
index 598552102f3691ba9f50839ad1e6cda673700e54..5187477d7b6824cb353fc0ca8235349c889631e8 100644
(file)
--- a/
c-bindings-gen/src/types.rs
+++ b/
c-bindings-gen/src/types.rs
@@
-190,7
+190,7
@@
pub struct GenericTypes<'a, 'b> {
self_ty: Option<String>,
parent: Option<&'b GenericTypes<'b, 'b>>,
typed_generics: HashMap<&'a syn::Ident, String>,
self_ty: Option<String>,
parent: Option<&'b GenericTypes<'b, 'b>>,
typed_generics: HashMap<&'a syn::Ident, String>,
- default_generics: HashMap<&'a syn::Ident, (syn::Type, syn::Type)>,
+ default_generics: HashMap<&'a syn::Ident, (syn::Type, syn::Type
, syn::Type
)>,
}
impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
pub fn new(self_ty: Option<String>) -> Self {
}
impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
pub fn new(self_ty: Option<String>) -> Self {
@@
-226,20
+226,25
@@
impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
if non_lifetimes_processed { return false; }
non_lifetimes_processed = true;
if path != "std::ops::Deref" && path != "core::ops::Deref" {
if non_lifetimes_processed { return false; }
non_lifetimes_processed = true;
if path != "std::ops::Deref" && path != "core::ops::Deref" {
+ let p = string_path_to_syn_path(&path);
+ let ref_ty = parse_quote!(&#p);
+ let mut_ref_ty = parse_quote!(&mut #p);
+ self.default_generics.insert(&type_param.ident, (syn::Type::Path(syn::TypePath { qself: None, path: p }), ref_ty, mut_ref_ty));
new_typed_generics.insert(&type_param.ident, Some(path));
new_typed_generics.insert(&type_param.ident, Some(path));
- } else
if trait_bound.path.segments.len() == 1
{
+ } else {
// If we're templated on Deref<Target = ConcreteThing>, store
// the reference type in `default_generics` which handles full
// types and not just paths.
if let syn::PathArguments::AngleBracketed(ref args) =
trait_bound.path.segments[0].arguments {
// If we're templated on Deref<Target = ConcreteThing>, store
// the reference type in `default_generics` which handles full
// types and not just paths.
if let syn::PathArguments::AngleBracketed(ref args) =
trait_bound.path.segments[0].arguments {
+ assert_eq!(trait_bound.path.segments.len(), 1);
for subargument in args.args.iter() {
match subargument {
syn::GenericArgument::Lifetime(_) => {},
syn::GenericArgument::Binding(ref b) => {
if &format!("{}", b.ident) != "Target" { return false; }
let default = &b.ty;
for subargument in args.args.iter() {
match subargument {
syn::GenericArgument::Lifetime(_) => {},
syn::GenericArgument::Binding(ref b) => {
if &format!("{}", b.ident) != "Target" { return false; }
let default = &b.ty;
- self.default_generics.insert(&type_param.ident, (parse_quote!(&#default), parse_quote!(&#default)));
+ self.default_generics.insert(&type_param.ident, (parse_quote!(&#default), parse_quote!(&#default)
, parse_quote!(&mut #default)
));
break 'bound_loop;
},
_ => unimplemented!(),
break 'bound_loop;
},
_ => unimplemented!(),
@@
-254,7
+259,7
@@
impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
}
if let Some(default) = type_param.default.as_ref() {
assert!(type_param.bounds.is_empty());
}
if let Some(default) = type_param.default.as_ref() {
assert!(type_param.bounds.is_empty());
- self.default_generics.insert(&type_param.ident, (default.clone(), parse_quote!(&#default)));
+ self.default_generics.insert(&type_param.ident, (default.clone(), parse_quote!(&#default)
, parse_quote!(&mut #default)
));
}
},
_ => {},
}
},
_ => {},
@@
-287,10
+292,11
@@
impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
qself: None, path: string_path_to_syn_path(&resolved)
});
let ref_ty = parse_quote!(&#ty);
qself: None, path: string_path_to_syn_path(&resolved)
});
let ref_ty = parse_quote!(&#ty);
+ let mut_ref_ty = parse_quote!(&mut #ty);
if types.crate_types.traits.get(&resolved).is_some() {
if types.crate_types.traits.get(&resolved).is_some() {
- self.default_generics.insert(p_ident, (ty, ref_ty));
+ self.default_generics.insert(p_ident, (ty, ref_ty
, mut_ref_ty
));
} else {
} else {
- self.default_generics.insert(p_ident, (ref_ty.clone(), ref_ty));
+ self.default_generics.insert(p_ident, (ref_ty.clone(), ref_ty
, mut_ref_ty
));
}
*gen = Some(resolved);
}
*gen = Some(resolved);
@@
-382,16
+388,20
@@
impl<'a, 'b, 'c: 'a + 'b> ResolveType<'c> for Option<&GenericTypes<'a, 'b>> {
match ty {
syn::Type::Path(p) => {
if let Some(ident) = p.path.get_ident() {
match ty {
syn::Type::Path(p) => {
if let Some(ident) = p.path.get_ident() {
- if let Some((ty, _)) = us.default_generics.get(ident) {
- return
ty
;
+ if let Some((ty, _
, _
)) = us.default_generics.get(ident) {
+ return
self.resolve_type(ty)
;
}
}
},
}
}
},
- syn::Type::Reference(syn::TypeReference { elem, .. }) => {
+ syn::Type::Reference(syn::TypeReference { elem,
mutability,
.. }) => {
if let syn::Type::Path(p) = &**elem {
if let Some(ident) = p.path.get_ident() {
if let syn::Type::Path(p) = &**elem {
if let Some(ident) = p.path.get_ident() {
- if let Some((_, refty)) = us.default_generics.get(ident) {
- return refty;
+ if let Some((_, refty, mut_ref_ty)) = us.default_generics.get(ident) {
+ if mutability.is_some() {
+ return self.resolve_type(mut_ref_ty);
+ } else {
+ return self.resolve_type(refty);
+ }
}
}
}
}
}
}
@@
-1342,7
+1352,7
@@
impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
if let syn::Lit::Int(i) = &l.lit {
if i.base10_digits().parse::<usize>().unwrap() >= 32 {
let mut buf = Vec::new();
if let syn::Lit::Int(i) = &l.lit {
if i.base10_digits().parse::<usize>().unwrap() >= 32 {
let mut buf = Vec::new();
- self.write_rust_type(&mut buf, generics, &a.elem);
+ self.write_rust_type(&mut buf, generics, &a.elem
, false
);
let ty = String::from_utf8(buf).unwrap();
ty == "u8"
} else {
let ty = String::from_utf8(buf).unwrap();
ty == "u8"
} else {
@@
-1642,7
+1652,7
@@
impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
}
}
}
}
- fn write_rust_path<W: std::io::Write>(&self, w: &mut W, generics_resolver: Option<&GenericTypes>, path: &syn::Path) {
+ fn write_rust_path<W: std::io::Write>(&self, w: &mut W, generics_resolver: Option<&GenericTypes>, path: &syn::Path
, with_ref_lifetime: bool
) {
if let Some(resolved) = self.maybe_resolve_path(&path, generics_resolver) {
if self.is_primitive(&resolved) {
write!(w, "{}", path.get_ident().unwrap()).unwrap();
if let Some(resolved) = self.maybe_resolve_path(&path, generics_resolver) {
if self.is_primitive(&resolved) {
write!(w, "{}", path.get_ident().unwrap()).unwrap();
@@
-1660,7
+1670,7
@@
impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
}
}
if let syn::PathArguments::AngleBracketed(args) = &path.segments.iter().last().unwrap().arguments {
}
}
if let syn::PathArguments::AngleBracketed(args) = &path.segments.iter().last().unwrap().arguments {
- self.write_rust_generic_arg(w, generics_resolver, args.args.iter());
+ self.write_rust_generic_arg(w, generics_resolver, args.args.iter()
, with_ref_lifetime
);
}
} else {
if path.leading_colon.is_some() {
}
} else {
if path.leading_colon.is_some() {
@@
-1670,7
+1680,7
@@
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 {
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, generics_resolver, args.args.iter());
+ self.write_rust_generic_arg(w, generics_resolver, args.args.iter()
, with_ref_lifetime
);
}
}
}
}
}
}
@@
-1690,7
+1700,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!(); }
match bound {
syn::TypeParamBound::Trait(tb) => {
if tb.paren_token.is_some() || tb.lifetimes.is_some() { unimplemented!(); }
- self.write_rust_path(w, generics_resolver, &tb.path);
+ self.write_rust_path(w, generics_resolver, &tb.path
, false
);
},
_ => unimplemented!(),
}
},
_ => unimplemented!(),
}
@@
-1703,38
+1713,40
@@
impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
if had_params { write!(w, ">").unwrap(); }
}
if had_params { write!(w, ">").unwrap(); }
}
- pub fn write_rust_generic_arg<'b, W: std::io::Write>(&self, w: &mut W, generics_resolver: Option<&GenericTypes>, generics: impl Iterator<Item=&'b syn::GenericArgument>) {
+ pub fn write_rust_generic_arg<'b, W: std::io::Write>(&self, w: &mut W, generics_resolver: Option<&GenericTypes>, generics: impl Iterator<Item=&'b syn::GenericArgument>
, with_ref_lifetime: bool
) {
write!(w, "<").unwrap();
for (idx, arg) in generics.enumerate() {
if idx != 0 { write!(w, ", ").unwrap(); }
match arg {
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, generics_resolver, t),
+ syn::GenericArgument::Type(t) => self.write_rust_type(w, generics_resolver, t
, with_ref_lifetime
),
_ => unimplemented!(),
}
}
write!(w, ">").unwrap();
}
_ => unimplemented!(),
}
}
write!(w, ">").unwrap();
}
- pub fn write_rust_type<W: std::io::Write>(&self, w: &mut W, generics: Option<&GenericTypes>, t: &syn::Type) {
+ pub fn write_rust_type<W: std::io::Write>(&self, w: &mut W, generics: Option<&GenericTypes>, t: &syn::Type
, with_ref_lifetime: bool
) {
match generics.resolve_type(t) {
syn::Type::Path(p) => {
if p.qself.is_some() {
unimplemented!();
}
match generics.resolve_type(t) {
syn::Type::Path(p) => {
if p.qself.is_some() {
unimplemented!();
}
- self.write_rust_path(w, generics, &p.path);
+ self.write_rust_path(w, generics, &p.path
, with_ref_lifetime
);
},
syn::Type::Reference(r) => {
write!(w, "&").unwrap();
if let Some(lft) = &r.lifetime {
write!(w, "'{} ", lft.ident).unwrap();
},
syn::Type::Reference(r) => {
write!(w, "&").unwrap();
if let Some(lft) = &r.lifetime {
write!(w, "'{} ", lft.ident).unwrap();
+ } else if with_ref_lifetime {
+ write!(w, "'static ").unwrap();
}
if r.mutability.is_some() {
write!(w, "mut ").unwrap();
}
}
if r.mutability.is_some() {
write!(w, "mut ").unwrap();
}
- self.write_rust_type(w, generics, &*r.elem);
+ self.write_rust_type(w, generics, &*r.elem
, with_ref_lifetime
);
},
syn::Type::Array(a) => {
write!(w, "[").unwrap();
},
syn::Type::Array(a) => {
write!(w, "[").unwrap();
- self.write_rust_type(w, generics, &a.elem);
+ self.write_rust_type(w, generics, &a.elem
, with_ref_lifetime
);
if let syn::Expr::Lit(l) = &a.len {
if let syn::Lit::Int(i) = &l.lit {
write!(w, "; {}]", i).unwrap();
if let syn::Expr::Lit(l) = &a.len {
if let syn::Lit::Int(i) = &l.lit {
write!(w, "; {}]", i).unwrap();
@@
-1743,14
+1755,14
@@
impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
}
syn::Type::Slice(s) => {
write!(w, "[").unwrap();
}
syn::Type::Slice(s) => {
write!(w, "[").unwrap();
- self.write_rust_type(w, generics, &s.elem);
+ self.write_rust_type(w, generics, &s.elem
, with_ref_lifetime
);
write!(w, "]").unwrap();
},
syn::Type::Tuple(s) => {
write!(w, "(").unwrap();
for (idx, t) in s.elems.iter().enumerate() {
if idx != 0 { write!(w, ", ").unwrap(); }
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, generics, &t);
+ self.write_rust_type(w, generics, &t
, with_ref_lifetime
);
}
write!(w, ")").unwrap();
},
}
write!(w, ")").unwrap();
},
@@
-2749,7
+2761,7
@@
impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
// lifetime, of which the only real available choice is `static`, obviously.
write!(w, "&'static {}", crate_pfx).unwrap();
if !c_ty {
// lifetime, of which the only real available choice is `static`, obviously.
write!(w, "&'static {}", crate_pfx).unwrap();
if !c_ty {
- self.write_rust_path(w, generics, path);
+ self.write_rust_path(w, generics, path
, with_ref_lifetime
);
} else {
// We shouldn't be mapping references in types, so panic here
unimplemented!();
} else {
// We shouldn't be mapping references in types, so panic here
unimplemented!();