Skip to content

Commit

Permalink
Fix field visibility for read-only WorldQuery types (#8163)
Browse files Browse the repository at this point in the history
# 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.
  • Loading branch information
JoJoJet authored Mar 22, 2023
1 parent 27f2265 commit ce33354
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
2 changes: 1 addition & 1 deletion crates/bevy_ecs/macros/src/fetch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,)*
}

Expand Down
28 changes: 28 additions & 0 deletions crates/bevy_ecs/src/query/fetch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<private::Q>) {
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.
Expand Down

0 comments on commit ce33354

Please sign in to comment.