From ce33354cee55322b12768d4ef7da58ce02adc43d Mon Sep 17 00:00:00 2001 From: JoJoJet <21144246+JoJoJet@users.noreply.github.com> Date: Wed, 22 Mar 2023 13:49:42 -0400 Subject: [PATCH] Fix field visibility for read-only `WorldQuery` types (#8163) # Objective 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. ## Solution For each field of a read-only `WorldQuery` variant, use the visibility of the associated field defined on the original struct. --- crates/bevy_ecs/macros/src/fetch.rs | 2 +- crates/bevy_ecs/src/query/fetch.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/macros/src/fetch.rs b/crates/bevy_ecs/macros/src/fetch.rs index 3ae328e952..a72b4d10f3 100644 --- a/crates/bevy_ecs/macros/src/fetch.rs +++ b/crates/bevy_ecs/macros/src/fetch.rs @@ -348,7 +348,7 @@ pub fn derive_world_query_impl(input: TokenStream) -> 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,)* } diff --git a/crates/bevy_ecs/src/query/fetch.rs b/crates/bevy_ecs/src/query/fetch.rs index 17aa0203ed..c9a18d1081 100644 --- a/crates/bevy_ecs/src/query/fetch.rs +++ b/crates/bevy_ecs/src/query/fetch.rs @@ -1394,6 +1394,34 @@ 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) { + for q in &query { + let _ = &q.a; + } + } + + crate::system::assert_is_system(my_system); + } + // Ensures that metadata types generated by the WorldQuery macro // do not conflict with user-defined types. // Regression test for https://github.com/bevyengine/bevy/issues/8010.