From 888e1465f6e4a52b1f916a405ad83b657a30eff1 Mon Sep 17 00:00:00 2001 From: JoJoJet <21144246+JoJoJet@users.noreply.github.com> Date: Wed, 22 Mar 2023 13:26:25 -0400 Subject: [PATCH 1/3] add a regression test for read-only field visibility --- crates/bevy_ecs/src/query/fetch.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/crates/bevy_ecs/src/query/fetch.rs b/crates/bevy_ecs/src/query/fetch.rs index 17aa0203ed72e..a37dd061a222f 100644 --- a/crates/bevy_ecs/src/query/fetch.rs +++ b/crates/bevy_ecs/src/query/fetch.rs @@ -1394,6 +1394,32 @@ 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 }; + + let mut world = World::new(); + let mut query = world.query::(); + for val in query.iter(&world) { + let _ = &val.a; + } + } + // 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. From 840a796049baafb1768bf5eeb2cdb75838dd8a91 Mon Sep 17 00:00:00 2001 From: JoJoJet <21144246+JoJoJet@users.noreply.github.com> Date: Wed, 22 Mar 2023 13:27:14 -0400 Subject: [PATCH 2/3] use correct visibility --- crates/bevy_ecs/macros/src/fetch.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/macros/src/fetch.rs b/crates/bevy_ecs/macros/src/fetch.rs index 3ae328e952074..a72b4d10f3094 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,)* } From 884b1f15ef2cf07582985fe1550aa2f5e442e0ba Mon Sep 17 00:00:00 2001 From: JoJoJet <21144246+JoJoJet@users.noreply.github.com> Date: Wed, 22 Mar 2023 13:33:53 -0400 Subject: [PATCH 3/3] prettify the regression test --- crates/bevy_ecs/src/query/fetch.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/crates/bevy_ecs/src/query/fetch.rs b/crates/bevy_ecs/src/query/fetch.rs index a37dd061a222f..c9a18d1081b78 100644 --- a/crates/bevy_ecs/src/query/fetch.rs +++ b/crates/bevy_ecs/src/query/fetch.rs @@ -1413,11 +1413,13 @@ mod tests { let _ = private::QReadOnly { a: &A }; - let mut world = World::new(); - let mut query = world.query::(); - for val in query.iter(&world) { - let _ = &val.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