Factor out helper for identifying maybe trivial types

This commit is contained in:
David Tolnay 2021-04-16 15:16:19 -07:00
parent 9c1737feff
commit c5f472ef62
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
3 changed files with 12 additions and 14 deletions

View File

@ -1592,11 +1592,7 @@ fn write_unique_ptr_common(out: &mut OutFile, ty: UniquePtr) {
// know at code generation time, so we generate both C++ and Rust side // know at code generation time, so we generate both C++ and Rust side
// bindings for a "new" method anyway. But the Rust code can't be called // bindings for a "new" method anyway. But the Rust code can't be called
// for Opaque types because the 'new' method is not implemented. // for Opaque types because the 'new' method is not implemented.
UniquePtr::Ident(ident) => { UniquePtr::Ident(ident) => out.types.is_maybe_trivial(ident),
out.types.structs.contains_key(ident)
|| out.types.enums.contains_key(ident)
|| out.types.aliases.contains_key(ident)
}
UniquePtr::CxxVector(_) => false, UniquePtr::CxxVector(_) => false,
}; };
@ -1704,9 +1700,7 @@ fn write_shared_ptr(out: &mut OutFile, key: NamedImplKey) {
// know at code generation time, so we generate both C++ and Rust side // know at code generation time, so we generate both C++ and Rust side
// bindings for a "new" method anyway. But the Rust code can't be called for // bindings for a "new" method anyway. But the Rust code can't be called for
// Opaque types because the 'new' method is not implemented. // Opaque types because the 'new' method is not implemented.
let can_construct_from_value = out.types.structs.contains_key(ident) let can_construct_from_value = out.types.is_maybe_trivial(ident);
|| out.types.enums.contains_key(ident)
|| out.types.aliases.contains_key(ident);
writeln!( writeln!(
out, out,

View File

@ -1302,9 +1302,7 @@ fn expand_unique_ptr(
let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve); let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let can_construct_from_value = types.structs.contains_key(ident) let can_construct_from_value = types.is_maybe_trivial(ident);
|| types.enums.contains_key(ident)
|| types.aliases.contains_key(ident);
let new_method = if can_construct_from_value { let new_method = if can_construct_from_value {
Some(quote! { Some(quote! {
#[doc(hidden)] #[doc(hidden)]
@ -1398,9 +1396,7 @@ fn expand_shared_ptr(
let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve); let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let can_construct_from_value = types.structs.contains_key(ident) let can_construct_from_value = types.is_maybe_trivial(ident);
|| types.enums.contains_key(ident)
|| types.aliases.contains_key(ident);
let new_method = if can_construct_from_value { let new_method = if can_construct_from_value {
Some(quote! { Some(quote! {
#[doc(hidden)] #[doc(hidden)]

View File

@ -250,6 +250,14 @@ impl<'a> Types<'a> {
ImproperCtype::Depends(ident) => self.struct_improper_ctypes.contains(ident), ImproperCtype::Depends(ident) => self.struct_improper_ctypes.contains(ident),
} }
} }
// Types which we need to assume could possibly exist by value on the Rust
// side.
pub fn is_maybe_trivial(&self, ty: &Ident) -> bool {
self.structs.contains_key(ty)
|| self.enums.contains_key(ty)
|| self.aliases.contains_key(ty)
}
} }
impl<'t, 'a> IntoIterator for &'t Types<'a> { impl<'t, 'a> IntoIterator for &'t Types<'a> {