Fix field visibility for read-only WorldQuery types (#8163)

When using the `#[derive(WorldQuery)]` macro, the `ReadOnly` struct
generated has default (private) visibility for each field, regardless of
the visibility of the original field.

For each field of a read-only `WorldQuery` variant, use the visibility
of the associated field defined on the original struct.
This commit is contained in:
JoJoJet 2023-03-22 13:49:42 -04:00 committed by François
parent d6aba58610
commit 673a62744e
2 changed files with 35 additions and 1 deletions

View File

@ -336,7 +336,7 @@ pub fn derive_world_query_impl(ast: DeriveInput) -> TokenStream {
#[doc = "`]."]
#[automatically_derived]
#visibility struct #read_only_struct_name #user_impl_generics #user_where_clauses {
#( #field_idents: #read_only_field_types, )*
#( #field_visibilities #field_idents: #read_only_field_types, )*
#(#(#ignored_field_attrs)* #ignored_field_visibilities #ignored_field_idents: #ignored_field_types,)*
}

View File

@ -1642,3 +1642,37 @@ unsafe impl<Q: WorldQuery> WorldQuery for NopWorldQuery<Q> {
/// SAFETY: `NopFetch` never accesses any data
unsafe impl<Q: WorldQuery> ReadOnlyWorldQuery for NopWorldQuery<Q> {}
#[cfg(test)]
mod tests {
use super::*;
use crate::{self as bevy_ecs, system::Query};
#[derive(Component)]
pub struct A;
// Ensures that each field of a `WorldQuery` struct's read-only variant
// has the same visibility as its corresponding mutable field.
#[test]
fn read_only_field_visibility() {
mod private {
use super::*;
#[derive(WorldQuery)]
#[world_query(mutable)]
pub struct Q {
pub a: &'static mut A,
}
}
let _ = private::QReadOnly { a: &A };
fn my_system(query: Query<private::Q>) {
for q in &query {
let _ = &q.a;
}
}
crate::system::assert_is_system(my_system);
}
}