Move overly-specific check to an assertion where its relevant
[ldk-c-bindings] / c-bindings-gen / src / types.rs
index c532b8136dcf7fe9203efe67e8016f203f413605..c96a3b9a2fd51220057d89381c95e77e2f5d11a6 100644 (file)
@@ -227,12 +227,13 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
                                                                non_lifetimes_processed = true;
                                                                if path != "std::ops::Deref" && path != "core::ops::Deref" {
                                                                        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 {
+                                                                               assert_eq!(trait_bound.path.segments.len(), 1);
                                                                                for subargument in args.args.iter() {
                                                                                        match subargument {
                                                                                                syn::GenericArgument::Lifetime(_) => {},
@@ -268,7 +269,8 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
                                                if p.qself.is_some() { return false; }
                                                if p.path.leading_colon.is_some() { return false; }
                                                let mut p_iter = p.path.segments.iter();
-                                               if let Some(gen) = new_typed_generics.get_mut(&p_iter.next().unwrap().ident) {
+                                               let p_ident = &p_iter.next().unwrap().ident;
+                                               if let Some(gen) = new_typed_generics.get_mut(p_ident) {
                                                        if gen.is_some() { return false; }
                                                        if &format!("{}", p_iter.next().unwrap().ident) != "Target" {return false; }
 
@@ -281,7 +283,14 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> {
                                                                        if non_lifetimes_processed { return false; }
                                                                        non_lifetimes_processed = true;
                                                                        assert_simple_bound(&trait_bound);
-                                                                       *gen = Some(types.resolve_path(&trait_bound.path, None));
+                                                                       let resolved = types.resolve_path(&trait_bound.path, None);
+                                                                       let ty = syn::Type::Path(syn::TypePath {
+                                                                               qself: None, path: string_path_to_syn_path(&resolved)
+                                                                       });
+                                                                       let ref_ty = parse_quote!(&#ty);
+                                                                       self.default_generics.insert(p_ident, (ty, ref_ty));
+
+                                                                       *gen = Some(resolved);
                                                                }
                                                        }
                                                } else { return false; }