Add FromWorld bound to T in Local<T> (#5481)

# Objective

Currently, actually using a `Local` on a system requires that it be `T: FromWorld`, but that requirement is only expressed on the `SystemParam` machinery, which leads to the confusing error message for when the user attempts to add an invalid system. By adding these bounds to `Local` directly, it improves clarity on usage and semantics. 

## Solution

- Add `T: FromWorld` bound to `Local`'s definition

## Migration Guide

- It might be possible for references to `Local`s without `T: FromWorld` to exist, but these should be exceedingly rare and probably dead code. In the event that one of these is encountered, the easiest solutions are to delete the code or wrap the inner `T` in an `Option` to allow it to be default constructed to `None`.
This commit is contained in:
PROMETHIA-27 2022-08-01 16:50:11 +00:00
parent bf085ee1d2
commit f3b5bf029c

View file

@ -640,12 +640,12 @@ impl<'w, 's> SystemParamFetch<'w, 's> for WorldState {
/// // .add_system(reset_to_system(my_config))
/// # assert_is_system(reset_to_system(Config(10)));
/// ```
pub struct Local<'a, T: Resource>(&'a mut T);
pub struct Local<'a, T: Resource + FromWorld>(&'a mut T);
// SAFETY: Local only accesses internal state
unsafe impl<T: Resource> ReadOnlySystemParamFetch for LocalState<T> {}
impl<'a, T: Resource> Debug for Local<'a, T>
impl<'a, T: Resource + FromWorld> Debug for Local<'a, T>
where
T: Debug,
{
@ -654,7 +654,7 @@ where
}
}
impl<'a, T: Resource> Deref for Local<'a, T> {
impl<'a, T: Resource + FromWorld> Deref for Local<'a, T> {
type Target = T;
#[inline]
@ -663,7 +663,7 @@ impl<'a, T: Resource> Deref for Local<'a, T> {
}
}
impl<'a, T: Resource> DerefMut for Local<'a, T> {
impl<'a, T: Resource + FromWorld> DerefMut for Local<'a, T> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
self.0