Support `extern_cpp_type!` with a different name
Backport of https://github.com/google/autocxx/pull/1150.
Change-Id: Ib92ff7c3feb8541e02d640881a28150821acb6ee
Signed-off-by: Brian Silverman <bsilver16384@gmail.com>
diff --git a/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs b/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs
index 9bea2e0..d1219d2 100644
--- a/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs
+++ b/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs
@@ -1133,13 +1133,16 @@
let id = name.type_path_from_root();
let super_duper = std::iter::repeat(make_ident("super"));
let supers = super_duper.take(ns_depth + 2);
+ let name_final = name.get_final_ident();
let use_statement = parse_quote! {
pub use #(#supers)::* :: #id;
};
RsCodegenResult {
bindgen_mod_items: vec![use_statement],
extern_c_mod_items: vec![self.generate_cxxbridge_type(name, true, Vec::new())],
- materializations: vec![Use::Custom(Box::new(parse_quote! { pub use #rust_path; }))],
+ materializations: vec![Use::Custom(Box::new(
+ parse_quote! { pub use #rust_path as #name_final; },
+ ))],
..Default::default()
}
}
diff --git a/third_party/autocxx/integration-tests/tests/integration_test.rs b/third_party/autocxx/integration-tests/tests/integration_test.rs
index 75319c9..3ccc2d0 100644
--- a/third_party/autocxx/integration-tests/tests/integration_test.rs
+++ b/third_party/autocxx/integration-tests/tests/integration_test.rs
@@ -6632,6 +6632,48 @@
}
#[test]
+fn test_extern_cpp_type_different_name() {
+ let hdr = indoc! {"
+ #include <cstdint>
+ struct A {
+ A() : a(0) {}
+ int a;
+ };
+ inline void handle_a(const A&) {
+ }
+ inline A create_a() {
+ A a;
+ return a;
+ }
+ "};
+ let hexathorpe = Token);
+ let rs = quote! {
+ use autocxx::prelude::*;
+ include_cpp! {
+ #hexathorpe include "input.h"
+ safety!(unsafe_ffi)
+ generate!("handle_a")
+ generate!("create_a")
+ extern_cpp_opaque_type!("A", crate::DifferentA)
+ }
+ #[cxx::bridge]
+ pub mod ffi2 {
+ unsafe extern "C++" {
+ include!("input.h");
+ type A;
+ }
+ impl UniquePtr<A> {}
+ }
+ pub use ffi2::A as DifferentA;
+ fn main() {
+ let a = ffi::create_a();
+ ffi::handle_a(&a);
+ }
+ };
+ do_run_test_manual("", hdr, rs, None, None).unwrap();
+}
+
+#[test]
fn test_extern_cpp_type_two_include_cpp() {
let hdr = indoc! {"
#include <cstdint>