bevy/crates
Gino Valente 724b36289c bevy_reflect: Decouple List and Array traits (#7467)
# Objective

Resolves #7121

## Solution

Decouples `List` and `Array` by removing `Array` as a supertrait of `List`. Additionally, similar methods from `Array` have been added to `List` so that their usages can remain largely unchanged.

#### Possible Alternatives

##### `Sequence`

My guess for why we originally made `List` a subtrait of `Array` is that they share a lot of common operations. We could potentially move these overlapping methods to a `Sequence` (name taken from #7059) trait and make that a supertrait of both. This would allow functions to contain logic that simply operates on a sequence rather than "list vs array".

However, this means that we'd need to add methods for converting to a `dyn Sequence`. It also might be confusing since we wouldn't add a `ReflectRef::Sequence` or anything like that. Is such a trait worth adding (either in this PR or a followup one)? 

---

## Changelog

- Removed `Array` as supertrait of `List`
  - Added methods to `List` that were previously provided by `Array`

## Migration Guide

The `List` trait is no longer dependent on `Array`. Implementors of `List` can remove the `Array` impl and move its methods into the `List` impl (with only a couple tweaks).

```rust
// BEFORE
impl Array for Foo {
  fn get(&self, index: usize) -> Option<&dyn Reflect> {/* ... */}
  fn get_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {/* ... */}
  fn len(&self) -> usize {/* ... */}
  fn is_empty(&self) -> bool {/* ... */}
  fn iter(&self) -> ArrayIter {/* ... */}
  fn drain(self: Box<Self>) -> Vec<Box<dyn Reflect>> {/* ... */}
  fn clone_dynamic(&self) -> DynamicArray {/* ... */}
}

impl List for Foo {
  fn insert(&mut self, index: usize, element: Box<dyn Reflect>) {/* ... */}
  fn remove(&mut self, index: usize) -> Box<dyn Reflect> {/* ... */}
  fn push(&mut self, value: Box<dyn Reflect>) {/* ... */}
  fn pop(&mut self) -> Option<Box<dyn Reflect>> {/* ... */}
  fn clone_dynamic(&self) -> DynamicList {/* ... */}
}

// AFTER
impl List for Foo {
  fn get(&self, index: usize) -> Option<&dyn Reflect> {/* ... */}
  fn get_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {/* ... */}
  fn insert(&mut self, index: usize, element: Box<dyn Reflect>) {/* ... */}
  fn remove(&mut self, index: usize) -> Box<dyn Reflect> {/* ... */}
  fn push(&mut self, value: Box<dyn Reflect>) {/* ... */}
  fn pop(&mut self) -> Option<Box<dyn Reflect>> {/* ... */}
  fn len(&self) -> usize {/* ... */}
  fn is_empty(&self) -> bool {/* ... */}
  fn iter(&self) -> ListIter {/* ... */}
  fn drain(self: Box<Self>) -> Vec<Box<dyn Reflect>> {/* ... */}
  fn clone_dynamic(&self) -> DynamicList {/* ... */}
}
```

Some other small tweaks that will need to be made include:
- Use `ListIter` for `List::iter` instead of `ArrayIter` (the return type from `Array::iter`)
- Replace `array_hash` with `list_hash` in `Reflect::reflect_hash` for implementors of `List`
2023-02-13 21:07:53 +00:00
..
bevy_animation Base Sets (#7466) 2023-02-06 03:10:08 +00:00
bevy_app add setup function to app (#7586) 2023-02-09 21:41:54 +00:00
bevy_asset Fix crash with debug_asset_server due to base set changes (#7538) 2023-02-07 14:18:15 +00:00
bevy_audio IOS, Android... same thing (#7493) 2023-02-06 18:08:49 +00:00
bevy_core Base Sets (#7466) 2023-02-06 03:10:08 +00:00
bevy_core_pipeline bevy_core_pipeline: Fix prepass sort orders (#7539) 2023-02-07 11:31:35 +00:00
bevy_derive update winit to 0.28 (#7480) 2023-02-03 16:41:39 +00:00
bevy_diagnostic Rename schedule v3 to schedule (#7519) 2023-02-06 18:44:40 +00:00
bevy_dylib Rename dynamic feature (#7340) 2023-01-23 14:28:00 +00:00
bevy_dynamic_plugin Adapt path type of dynamically_load_plugin (#6734) 2022-12-05 23:39:43 +00:00
bevy_ecs Document usage of SRes::into_inner on the RenderCommand trait (#7224) 2023-02-13 18:44:26 +00:00
bevy_ecs_compile_fail_tests Fix clippy lints and failed test with Rust 1.66 (#6945) 2022-12-15 18:05:15 +00:00
bevy_encase_derive add helper for macro to get either bevy::x or bevy_x depending on how it was imported (#7164) 2023-01-11 21:12:02 +00:00
bevy_gilrs Base Sets (#7466) 2023-02-06 03:10:08 +00:00
bevy_gltf Add extras field to GltfNode (#6973) 2023-02-13 17:56:36 +00:00
bevy_hierarchy Base Sets (#7466) 2023-02-06 03:10:08 +00:00
bevy_input Rename schedule v3 to schedule (#7519) 2023-02-06 18:44:40 +00:00
bevy_internal Introduce detailed_trace macro, use in TrackedRenderPass (#7639) 2023-02-13 18:20:27 +00:00
bevy_log Fix suppression of all console logs when trace_tracy is enabled (#6955) 2022-12-20 23:45:43 +00:00
bevy_macro_utils Base Sets (#7466) 2023-02-06 03:10:08 +00:00
bevy_math Improve code/comments for Ray::intersect_plane and its tests (#6823) 2022-12-05 22:49:06 +00:00
bevy_mikktspace Release 0.9.0 (#6568) 2022-11-12 20:01:29 +00:00
bevy_pbr Reusable Material Pipeline (#7548) 2023-02-13 19:33:51 +00:00
bevy_ptr Fix minor typos in code and docs (#7378) 2023-01-27 12:12:53 +00:00
bevy_reflect bevy_reflect: Decouple List and Array traits (#7467) 2023-02-13 21:07:53 +00:00
bevy_reflect_compile_fail_tests Enable deriving Reflect on structs with generic types (#7364) 2023-01-28 00:12:06 +00:00
bevy_render Document usage of SRes::into_inner on the RenderCommand trait (#7224) 2023-02-13 18:44:26 +00:00
bevy_scene Base Sets (#7466) 2023-02-06 03:10:08 +00:00
bevy_sprite Refactor Globals and View structs into separate shaders (#7512) 2023-02-11 17:55:18 +00:00
bevy_tasks improve safety comment in scope function (#7534) 2023-02-13 18:20:17 +00:00
bevy_text Fix Window feedback loop between the OS and Bevy (#7517) 2023-02-07 14:18:13 +00:00
bevy_time Rename schedule v3 to schedule (#7519) 2023-02-06 18:44:40 +00:00
bevy_transform typo in comment (#7618) 2023-02-11 02:00:14 +00:00
bevy_ui Add doc tests for the Size constructor functions (#7658) 2023-02-13 18:20:34 +00:00
bevy_utils Introduce detailed_trace macro, use in TrackedRenderPass (#7639) 2023-02-13 18:20:27 +00:00
bevy_window Fix closing window does not exit app in desktop_app mode (#7628) 2023-02-13 19:15:24 +00:00
bevy_winit Fix Window feedback loop between the OS and Bevy (#7517) 2023-02-07 14:18:13 +00:00