Skip to content

Commit c4f2096

Browse files
committed
Handle writing Rust types for single-impl traits
Single-impl traits which are marked no-export (like `AChannelManager` in LDK) are mapped as the singular implementing type, rather than a full-blown trait. Here we handle this case when writing Rust objects (generally used in writing generic bounds).
1 parent 5deb00b commit c4f2096

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

c-bindings-gen/src/types.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1983,11 +1983,19 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
19831983
// the original crate.
19841984
write!(w, "{}", self.real_rust_type_mapping(&resolved)).unwrap();
19851985
} else {
1986+
if let Some(trait_impls) = self.crate_types.traits_impld.get(&resolved) {
1987+
if self.crate_types.traits.get(&resolved).is_none() && trait_impls.len() == 1 {
1988+
write!(w, "crate::{}", trait_impls[0]).unwrap();
1989+
return;
1990+
}
1991+
}
19861992
write!(w, "crate::{}", resolved).unwrap();
19871993
}
19881994
}
1989-
if let syn::PathArguments::AngleBracketed(args) = &path.segments.iter().last().unwrap().arguments {
1990-
self.write_rust_generic_arg(w, generics_resolver, args.args.iter(), with_ref_lifetime);
1995+
if !generated_crate_ref {
1996+
if let syn::PathArguments::AngleBracketed(args) = &path.segments.iter().last().unwrap().arguments {
1997+
self.write_rust_generic_arg(w, generics_resolver, args.args.iter(), with_ref_lifetime);
1998+
}
19911999
}
19922000
} else {
19932001
if path.leading_colon.is_some() {
@@ -2051,7 +2059,11 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
20512059
}
20522060
if let Some(resolved_ty) = self.maybe_resolve_path(&p.path, generics) {
20532061
generate_crate_ref |= self.maybe_resolve_path(&p.path, None).as_ref() != Some(&resolved_ty);
2054-
if self.crate_types.traits.get(&resolved_ty).is_none() { generate_crate_ref = false; }
2062+
let mut is_trait = self.crate_types.traits.get(&resolved_ty).is_some();
2063+
is_trait |= self.crate_types.traits_impld.get(&resolved_ty).is_some();
2064+
if !is_trait {
2065+
generate_crate_ref = false;
2066+
}
20552067
}
20562068
self.write_rust_path(w, generics, &p.path, with_ref_lifetime, generate_crate_ref);
20572069
},

0 commit comments

Comments
 (0)