Respect explicit impls on Vec and Box
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 419e46c..6881e4c 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -1255,14 +1255,22 @@
out.set_namespace(Default::default());
out.begin_block(Block::ExternC);
for ty in out.types {
- if let Type::RustBox(ty) = ty {
- if let Type::Ident(inner) = &ty.inner {
- out.next_section();
- write_rust_box_extern(out, &out.types.resolve(&inner));
+ if let Type::RustBox(ptr) = ty {
+ if let Type::Ident(inner) = &ptr.inner {
+ if Atom::from(&inner.rust).is_none()
+ && (!out.types.aliases.contains_key(&inner.rust)
+ || out.types.explicit_impls.contains(ty))
+ {
+ out.next_section();
+ write_rust_box_extern(out, &out.types.resolve(&inner));
+ }
}
- } else if let Type::RustVec(ty) = ty {
- if let Type::Ident(inner) = &ty.inner {
- if Atom::from(&inner.rust).is_none() {
+ } else if let Type::RustVec(vec) = ty {
+ if let Type::Ident(inner) = &vec.inner {
+ if Atom::from(&inner.rust).is_none()
+ && (!out.types.aliases.contains_key(&inner.rust)
+ || out.types.explicit_impls.contains(ty))
+ {
out.next_section();
write_rust_vec_extern(out, inner);
}
@@ -1287,8 +1295,8 @@
write_shared_ptr(out, inner);
}
}
- } else if let Type::CxxVector(ptr) = ty {
- if let Type::Ident(inner) = &ptr.inner {
+ } else if let Type::CxxVector(vector) = ty {
+ if let Type::Ident(inner) = &vector.inner {
if Atom::from(&inner.rust).is_none()
&& (!out.types.aliases.contains_key(&inner.rust)
|| out.types.explicit_impls.contains(ty))
@@ -1304,13 +1312,21 @@
out.begin_block(Block::Namespace("rust"));
out.begin_block(Block::InlineNamespace("cxxbridge1"));
for ty in out.types {
- if let Type::RustBox(ty) = ty {
- if let Type::Ident(inner) = &ty.inner {
- write_rust_box_impl(out, &out.types.resolve(&inner));
+ if let Type::RustBox(ptr) = ty {
+ if let Type::Ident(inner) = &ptr.inner {
+ if Atom::from(&inner.rust).is_none()
+ && (!out.types.aliases.contains_key(&inner.rust)
+ || out.types.explicit_impls.contains(ty))
+ {
+ write_rust_box_impl(out, &out.types.resolve(&inner));
+ }
}
- } else if let Type::RustVec(ty) = ty {
- if let Type::Ident(inner) = &ty.inner {
- if Atom::from(&inner.rust).is_none() {
+ } else if let Type::RustVec(vec) = ty {
+ if let Type::Ident(inner) = &vec.inner {
+ if Atom::from(&inner.rust).is_none()
+ && (!out.types.aliases.contains_key(&inner.rust)
+ || out.types.explicit_impls.contains(ty))
+ {
write_rust_vec_impl(out, inner);
}
}