From b73b85b66ae904691fbff98c963e67f27e1af1e7 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 5 Feb 2021 23:26:53 -0500 Subject: [PATCH] [bindings] Use resolved, not local ident in generic mangling In traits with associated types which are returned in generics (ie `trait T { type A: B; fn c() -> Result {} }`), we created a new generic mapping with the local type name (in this case A) instead of using the real type (in this case B). This is confusing as it results in generic manglings that don't reference the real type (eg `LDKCResult_ChanKeySignerDecodeErrorZ`) and may have multiple generic definitions that are identical. Instead, we now use the final ident in the resolved mapping. The biggest win is `LDKCResult_ChanKeySignerDecodeErrorZ` changing to `CResult_ChannelKeysDecodeErrorZ`. However, there are several types where `secp256k1::Error` was imported as `SecpError` and types like `LDKCResult_SecretKeySecpErrorZ` are now `LDKCResult_SecretKeyErrorZ` instead. Still, the type of the error field remains `LDKSecp256k1Error`, which should avoid any confusion. --- c-bindings-gen/src/types.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 75995b843..ed88c502a 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -1878,7 +1878,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { generics, &subtype, is_ref, is_mut, ptr_for_ref, true); } } else { - let id = &&$p_arg.path.segments.iter().rev().next().unwrap().ident; + let id = subtype.rsplitn(2, ':').next().unwrap(); // Get the "Base" name of the resolved type write!(w, "{}", id).unwrap(); write!(mangled_type, "{}", id).unwrap(); if let Some(w2) = $extra_write as Option<&mut Vec> { -- 2.39.5