bevy/crates
Gino Valente 95242fad72 bevy_reflect: Opt-out attribute for TypePath (#9140)
Fixes #9094

Takes a bit from
[this](https://github.com/bevyengine/bevy/issues/9094#issuecomment-1629333851)
comment as well as a
[comment](https://discord.com/channels/691052431525675048/1002362493634629796/1128024873260810271)
from @soqb.

This allows users to opt-out of the `TypePath` implementation that is
automatically generated by the `Reflect` derive macro, allowing custom
`TypePath` implementations.

```rust
struct Foo<T> {
    #[reflect(ignore)]
    _marker: PhantomData<T>,
}

struct NotTypePath;

impl<T: 'static> TypePath for Foo<T> {
    fn type_path() -> &'static str {
        std::any::type_name::<Self>()
    }

    fn short_type_path() -> &'static str {
        static CELL: GenericTypePathCell = GenericTypePathCell::new();
        CELL.get_or_insert::<Self, _>(|| {
            bevy_utils::get_short_name(std::any::type_name::<Self>())
        })
    }

    fn crate_name() -> Option<&'static str> {
        Some("my_crate")
    }

    fn module_path() -> Option<&'static str> {
        Some("my_crate::foo")
    }

    fn type_ident() -> Option<&'static str> {
        Some("Foo")
    }
}

// Can use `TypePath`
let _ = <Foo<NotTypePath> as TypePath>::type_path();

// Can register the type
let mut registry = TypeRegistry::default();
registry.register::<Foo<NotTypePath>>();
```

The stability of type paths mainly come into play during serialization.
If a type is moved between builds, an unstable type path may become
invalid.

Users that opt-out of `TypePath` and rely on something like
`std::any::type_name` as in the example above, should be aware that this
solution removes the stability guarantees. Deserialization thus expects
that type to never move. If it does, then the serialized type paths will
need to be updated accordingly.

If a user depends on stability, they will need to implement that
stability logic manually (probably by looking at the expanded output of
a typical `Reflect`/`TypePath` derive). This could be difficult for type
parameters that don't/can't implement `TypePath`, and will need to make
heavy use of string parsing and manipulation to achieve the same effect
(alternatively, they can choose to simply exclude any type parameter
that doesn't implement `TypePath`).

---

- Added the `#[reflect(type_path = false)]` attribute to opt out of the
`TypePath` impl when deriving `Reflect`

---------

Co-authored-by: Carter Anderson <mcanders1@gmail.com>
2023-08-09 18:11:07 -07:00
..
bevy_a11y Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_animation Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_app Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_asset Improve Mesh documentation (#9061) 2023-08-09 18:04:04 -07:00
bevy_audio Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_core Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_core_pipeline Extend the default render range of 2D camera (#9310) 2023-08-09 18:06:15 -07:00
bevy_derive Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_diagnostic Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_dylib Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_dynamic_plugin Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_ecs Fix ambiguous_with breaking run conditions (#9253) 2023-08-09 18:06:37 -07:00
bevy_ecs_compile_fail_tests Resolve clippy issues for rust 1.70.0 (#8738) 2023-06-01 21:05:05 +00:00
bevy_encase_derive Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_gilrs Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_gizmos Clarify immediate mode in Gizmos documentation (#9183) 2023-08-09 18:06:01 -07:00
bevy_gltf Improve Mesh documentation (#9061) 2023-08-09 18:04:04 -07:00
bevy_hierarchy Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_input Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_internal Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_log Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_macro_utils Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_macros_compile_fail_tests bevy_derive: Add #[deref] attribute (#8552) 2023-05-16 18:29:09 +00:00
bevy_math Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_mikktspace Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_pbr Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_ptr Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_reflect bevy_reflect: Opt-out attribute for TypePath (#9140) 2023-08-09 18:11:07 -07:00
bevy_reflect_compile_fail_tests bevy_reflect: FromReflect Ergonomics Implementation (#6056) 2023-06-29 01:31:34 +00:00
bevy_render Update Camera's Frustum only when its GlobalTransform or CameraProjection changed (#9092) 2023-08-09 18:09:10 -07:00
bevy_scene Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_sprite Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_tasks Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_text Fix for vertical text bounds and alignment (#9133) 2023-08-09 18:00:58 -07:00
bevy_time Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_transform Update GlobalTransform on insertion (#9081) 2023-08-09 18:00:29 -07:00
bevy_ui Remove the With<Parent> query filter from bevy_ui::render::extract_uinode_borders (#9285) 2023-08-09 18:06:25 -07:00
bevy_utils Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00
bevy_window improve documentation relating to WindowPlugin and Window (#9173) 2023-08-09 18:03:48 -07:00
bevy_winit Release 0.11.0 (#9080) 2023-07-09 08:43:47 +00:00