Skip to content

Commit af3ad4b

Browse files
committed
[bindings] Pass GenericTypes through to write_template_generic
With this we support types like `Result<Self::AssociatedType, ()>`.
1 parent 3f5a287 commit af3ad4b

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

c-bindings-gen/src/types.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,14 +1734,14 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
17341734
self.write_c_mangled_container_path_intern(w, Self::path_to_generic_args(path), generics,
17351735
&format!("{}", single_ident_generic_path_to_ident(path).unwrap()), is_ref, false, false, false);
17361736
} else {
1737-
self.write_template_generics(w, &mut [$item].iter().map(|t| *t), is_ref, true);
1737+
self.write_template_generics(w, &mut [$item].iter().map(|t| *t), generics, is_ref, true);
17381738
}
17391739
} else if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = $item {
17401740
self.write_c_mangled_container_path_intern(w, elems.iter().collect(), generics,
17411741
&format!("{}Tuple", elems.len()), is_ref, false, false, false);
17421742
} else { unimplemented!(); }
17431743
write!(w, ") -> {} =\n\t{}::CResultTempl::<", mangled_container, Self::container_templ_path()).unwrap();
1744-
self.write_template_generics(w, &mut args.iter().map(|t| *t), is_ref, true);
1744+
self.write_template_generics(w, &mut args.iter().map(|t| *t), generics, is_ref, true);
17451745
writeln!(w, ">::{};\n", $call).unwrap();
17461746
} }
17471747
}
@@ -1770,7 +1770,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
17701770
}
17711771
}
17721772

1773-
fn write_template_generics<'b, W: std::io::Write>(&self, w: &mut W, args: &mut dyn Iterator<Item=&'b syn::Type>, is_ref: bool, in_crate: bool) {
1773+
fn write_template_generics<'b, W: std::io::Write>(&self, w: &mut W, args: &mut dyn Iterator<Item=&'b syn::Type>, generics: Option<&GenericTypes>, is_ref: bool, in_crate: bool) {
17741774
for (idx, t) in args.enumerate() {
17751775
if idx != 0 {
17761776
write!(w, ", ").unwrap();
@@ -1780,11 +1780,11 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
17801780
write!(w, "u8").unwrap();
17811781
} else {
17821782
write!(w, "{}::C{}TupleTempl<", Self::container_templ_path(), tup.elems.len()).unwrap();
1783-
self.write_template_generics(w, &mut tup.elems.iter(), is_ref, in_crate);
1783+
self.write_template_generics(w, &mut tup.elems.iter(), generics, is_ref, in_crate);
17841784
write!(w, ">").unwrap();
17851785
}
17861786
} else if let syn::Type::Path(p_arg) = t {
1787-
let resolved_generic = self.resolve_path(&p_arg.path, None);
1787+
let resolved_generic = self.resolve_path(&p_arg.path, generics);
17881788
if self.is_primitive(&resolved_generic) {
17891789
write!(w, "{}", resolved_generic).unwrap();
17901790
} else if let Some(c_type) = self.c_type_from_path(&resolved_generic, is_ref, false) {
@@ -1794,19 +1794,19 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
17941794
if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments {
17951795
self.write_template_generics(w, &mut args.args.iter().map(|gen|
17961796
if let syn::GenericArgument::Type(t) = gen { t } else { unimplemented!() }),
1797-
is_ref, in_crate);
1797+
generics, is_ref, in_crate);
17981798
} else { unimplemented!(); }
17991799
write!(w, ">").unwrap();
18001800
} else if resolved_generic == "Option" {
18011801
if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments {
18021802
self.write_template_generics(w, &mut args.args.iter().map(|gen|
18031803
if let syn::GenericArgument::Type(t) = gen { t } else { unimplemented!() }),
1804-
is_ref, in_crate);
1804+
generics, is_ref, in_crate);
18051805
} else { unimplemented!(); }
18061806
} else if in_crate {
18071807
write!(w, "{}", c_type).unwrap();
18081808
} else {
1809-
self.write_rust_type(w, None, &t);
1809+
self.write_rust_type(w, generics, &t);
18101810
}
18111811
} else {
18121812
// If we just write out resolved_generic, it may mostly work, however for
@@ -1826,7 +1826,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
18261826
}
18271827
} else if let syn::Type::Reference(r_arg) = t {
18281828
if let syn::Type::Path(p_arg) = &*r_arg.elem {
1829-
let resolved = self.resolve_path(&p_arg.path, None);
1829+
let resolved = self.resolve_path(&p_arg.path, generics);
18301830
if self.crate_types.opaques.get(&resolved).is_some() {
18311831
write!(w, "crate::{}", resolved).unwrap();
18321832
} else {
@@ -1836,7 +1836,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
18361836
} else { unimplemented!(); }
18371837
} else if let syn::Type::Array(a_arg) = t {
18381838
if let syn::Type::Path(p_arg) = &*a_arg.elem {
1839-
let resolved = self.resolve_path(&p_arg.path, None);
1839+
let resolved = self.resolve_path(&p_arg.path, generics);
18401840
assert!(self.is_primitive(&resolved));
18411841
if let syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(len), .. }) = &a_arg.len {
18421842
write!(w, "{}",
@@ -1853,12 +1853,12 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
18531853

18541854
write!(&mut created_container, "#[no_mangle]\npub type {} = ", mangled_container).unwrap();
18551855
write!(&mut created_container, "{}::C{}Templ<", Self::container_templ_path(), container_type).unwrap();
1856-
self.write_template_generics(&mut created_container, &mut args.iter().map(|t| *t), is_ref, true);
1856+
self.write_template_generics(&mut created_container, &mut args.iter().map(|t| *t), generics, is_ref, true);
18571857
writeln!(&mut created_container, ">;").unwrap();
18581858

18591859
write!(&mut created_container, "#[no_mangle]\npub static {}_free: extern \"C\" fn({}) = ", mangled_container, mangled_container).unwrap();
18601860
write!(&mut created_container, "{}::C{}Templ_free::<", Self::container_templ_path(), container_type).unwrap();
1861-
self.write_template_generics(&mut created_container, &mut args.iter().map(|t| *t), is_ref, true);
1861+
self.write_template_generics(&mut created_container, &mut args.iter().map(|t| *t), generics, is_ref, true);
18621862
writeln!(&mut created_container, ">;").unwrap();
18631863

18641864
self.write_template_constructor(&mut created_container, container_type, &mangled_container, &args, generics, is_ref);

0 commit comments

Comments
 (0)