bevy/crates/bevy_ecs_compile_fail_tests/tests/ui
Mark Wainwright f0a8994f55
Split WorldQuery into WorldQueryData and WorldQueryFilter (#9918)
# Objective

- Fixes #7680
- This is an updated for https://github.com/bevyengine/bevy/pull/8899
which had the same objective but fell a long way behind the latest
changes


## Solution

The traits `WorldQueryData : WorldQuery` and `WorldQueryFilter :
WorldQuery` have been added and some of the types and functions from
`WorldQuery` has been moved into them.

`ReadOnlyWorldQuery` has been replaced with `ReadOnlyWorldQueryData`. 

`WorldQueryFilter` is safe (as long as `WorldQuery` is implemented
safely).

`WorldQueryData` is unsafe - safely implementing it requires that
`Self::ReadOnly` is a readonly version of `Self` (this used to be a
safety requirement of `WorldQuery`)

The type parameters `Q` and `F` of `Query` must now implement
`WorldQueryData` and `WorldQueryFilter` respectively.

This makes it impossible to accidentally use a filter in the data
position or vice versa which was something that could lead to bugs.
~~Compile failure tests have been added to check this.~~

It was previously sometimes useful to use `Option<With<T>>` in the data
position. Use `Has<T>` instead in these cases.

The `WorldQuery` derive macro has been split into separate derive macros
for `WorldQueryData` and `WorldQueryFilter`.

Previously it was possible to derive both `WorldQuery` for a struct that
had a mixture of data and filter items. This would not work correctly in
some cases but could be a useful pattern in others. *This is no longer
possible.*

---

## Notes

- The changes outside of `bevy_ecs` are all changing type parameters to
the new types, updating the macro use, or replacing `Option<With<T>>`
with `Has<T>`.

- All `WorldQueryData` types always returned `true` for `IS_ARCHETYPAL`
so I moved it to `WorldQueryFilter` and
replaced all calls to it with `true`. That should be the only logic
change outside of the macro generation code.

- `Changed<T>` and `Added<T>` were being generated by a macro that I
have expanded. Happy to revert that if desired.

- The two derive macros share some functions for implementing
`WorldQuery` but the tidiest way I could find to implement them was to
give them a ton of arguments and ask clippy to ignore that.

## Changelog

### Changed
- Split `WorldQuery` into `WorldQueryData` and `WorldQueryFilter` which
now have separate derive macros. It is not possible to derive both for
the same type.
- `Query` now requires that the first type argument implements
`WorldQueryData` and the second implements `WorldQueryFilter`

## Migration Guide

- Update derives

```rust
// old
#[derive(WorldQuery)]
#[world_query(mutable, derive(Debug))]
struct CustomQuery {
    entity: Entity,
    a: &'static mut ComponentA
}

#[derive(WorldQuery)]
struct QueryFilter {
    _c: With<ComponentC>
}

// new 
#[derive(WorldQueryData)]
#[world_query_data(mutable, derive(Debug))]
struct CustomQuery {
    entity: Entity,
    a: &'static mut ComponentA,
}

#[derive(WorldQueryFilter)]
struct QueryFilter {
    _c: With<ComponentC>
}
```
- Replace `Option<With<T>>` with `Has<T>`

```rust
/// old
fn my_system(query: Query<(Entity, Option<With<ComponentA>>)>)
{
  for (entity, has_a_option) in query.iter(){
    let has_a:bool = has_a_option.is_some();
    //todo!()
  }
}

/// new
fn my_system(query: Query<(Entity, Has<ComponentA>)>)
{
  for (entity, has_a) in query.iter(){
    //todo!()
  }
}
```

- Fix queries which had filters in the data position or vice versa.

```rust
// old
fn my_system(query: Query<(Entity, With<ComponentA>)>)
{
  for (entity, _) in query.iter(){
  //todo!()
  }
}

// new
fn my_system(query: Query<Entity, With<ComponentA>>)
{
  for entity in query.iter(){
  //todo!()
  }
}

// old
fn my_system(query: Query<AnyOf<(&ComponentA, With<ComponentB>)>>)
{
  for (entity, _) in query.iter(){
  //todo!()
  }
}

// new
fn my_system(query: Query<Option<&ComponentA>, Or<(With<ComponentA>, With<ComponentB>)>>)
{
  for entity in query.iter(){
  //todo!()
  }
}

```

---------

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2023-11-28 03:56:07 +00:00
..
entity_ref_mut_lifetime_safety.rs EntityMut: rename remove_intersection to remove and remove to take (#7810) 2023-02-26 00:09:19 +00:00
entity_ref_mut_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
query_exact_sized_iterator_safety.rs Update ExactSizeIterator impl to support archetypal filters (With, Without) (#5124) 2022-06-29 02:15:28 +00:00
query_exact_sized_iterator_safety.stderr Fix CI for Rust 1.72 (#9562) 2023-08-25 12:34:24 +00:00
query_iter_combinations_mut_iterator_safety.rs Replace many_for_each_mut with iter_many_mut. (#5402) 2022-07-30 01:38:13 +00:00
query_iter_combinations_mut_iterator_safety.stderr Split WorldQuery into WorldQueryData and WorldQueryFilter (#9918) 2023-11-28 03:56:07 +00:00
query_iter_many_mut_iterator_safety.rs Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
query_iter_many_mut_iterator_safety.stderr Split WorldQuery into WorldQueryData and WorldQueryFilter (#9918) 2023-11-28 03:56:07 +00:00
query_lifetime_safety.rs Spawn now takes a Bundle (#6054) 2022-09-23 19:55:54 +00:00
query_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
query_to_readonly.rs Allows conversion of mutable queries to immutable queries (#5376) 2022-07-20 01:09:45 +00:00
query_to_readonly.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_param_derive_readonly.rs Simplify trait hierarchy for SystemParam (#6865) 2022-12-11 18:34:14 +00:00
system_param_derive_readonly.stderr Split WorldQuery into WorldQueryData and WorldQueryFilter (#9918) 2023-11-28 03:56:07 +00:00
system_query_get_lifetime_safety.rs Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
system_query_get_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_query_get_many_lifetime_safety.rs Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
system_query_get_many_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_query_get_many_mut_lifetime_safety.rs Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
system_query_get_many_mut_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_query_iter_lifetime_safety.rs Assert compiler errors for compile_fail tests (#3067) 2021-11-13 22:43:19 +00:00
system_query_iter_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_query_iter_many_mut_lifetime_safety.rs Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
system_query_iter_many_mut_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_query_set_get_lifetime_safety.rs Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
system_query_set_get_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_query_set_iter_lifetime_safety.rs ParamSet for conflicting SystemParam:s (#2765) 2022-03-29 23:39:38 +00:00
system_query_set_iter_lifetime_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
system_state_get_lifetime_safety.rs Assert compiler errors for compile_fail tests (#3067) 2021-11-13 22:43:19 +00:00
system_state_get_lifetime_safety.stderr Assert compiler errors for compile_fail tests (#3067) 2021-11-13 22:43:19 +00:00
system_state_iter_lifetime_safety.rs Assert compiler errors for compile_fail tests (#3067) 2021-11-13 22:43:19 +00:00
system_state_iter_lifetime_safety.stderr Assert compiler errors for compile_fail tests (#3067) 2021-11-13 22:43:19 +00:00
system_state_iter_mut_overlap_safety.rs Spawn now takes a Bundle (#6054) 2022-09-23 19:55:54 +00:00
system_state_iter_mut_overlap_safety.stderr Updates for rust 1.73 (#10035) 2023-10-06 00:31:10 +00:00
world_query_derive.rs Split WorldQuery into WorldQueryData and WorldQueryFilter (#9918) 2023-11-28 03:56:07 +00:00
world_query_derive.stderr Split WorldQuery into WorldQueryData and WorldQueryFilter (#9918) 2023-11-28 03:56:07 +00:00