 d70595b667
			
		
	
	
		d70595b667
		
			
		
	
	
	
	
		
			
			# Objective - Fixes #6370 - Closes #6581 ## Solution - Added the following lints to the workspace: - `std_instead_of_core` - `std_instead_of_alloc` - `alloc_instead_of_core` - Used `cargo +nightly fmt` with [item level use formatting](https://rust-lang.github.io/rustfmt/?version=v1.6.0&search=#Item%5C%3A) to split all `use` statements into single items. - Used `cargo clippy --workspace --all-targets --all-features --fix --allow-dirty` to _attempt_ to resolve the new linting issues, and intervened where the lint was unable to resolve the issue automatically (usually due to needing an `extern crate alloc;` statement in a crate root). - Manually removed certain uses of `std` where negative feature gating prevented `--all-features` from finding the offending uses. - Used `cargo +nightly fmt` with [crate level use formatting](https://rust-lang.github.io/rustfmt/?version=v1.6.0&search=#Crate%5C%3A) to re-merge all `use` statements matching Bevy's previous styling. - Manually fixed cases where the `fmt` tool could not re-merge `use` statements due to conditional compilation attributes. ## Testing - Ran CI locally ## Migration Guide The MSRV is now 1.81. Please update to this version or higher. ## Notes - This is a _massive_ change to try and push through, which is why I've outlined the semi-automatic steps I used to create this PR, in case this fails and someone else tries again in the future. - Making this change has no impact on user code, but does mean Bevy contributors will be warned to use `core` and `alloc` instead of `std` where possible. - This lint is a critical first step towards investigating `no_std` options for Bevy. --------- Co-authored-by: François Mockers <francois.mockers@vleue.com>
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use crate::Reflect;
 | |
| 
 | |
| /// Marks a type as a [reflectable] wrapper for a remote type.
 | |
| ///
 | |
| /// This allows types from external libraries (remote types) to be included in reflection.
 | |
| ///
 | |
| /// # Safety
 | |
| ///
 | |
| /// It is highly recommended to avoid implementing this trait manually and instead use the
 | |
| /// [`#[reflect_remote]`](crate::reflect_remote) attribute macro.
 | |
| /// This is because the trait tends to rely on [`transmute`], which is [very unsafe].
 | |
| ///
 | |
| /// The macro will ensure that the following safety requirements are met:
 | |
| /// - `Self` is a single-field tuple struct (i.e. a newtype) containing the remote type.
 | |
| /// - `Self` is `#[repr(transparent)]` over the remote type.
 | |
| ///
 | |
| /// Additionally, the macro will automatically generate [`Reflect`] and [`FromReflect`] implementations,
 | |
| /// along with compile-time assertions to validate that the safety requirements have been met.
 | |
| ///
 | |
| /// # Example
 | |
| ///
 | |
| /// ```
 | |
| /// use bevy_reflect_derive::{reflect_remote, Reflect};
 | |
| ///
 | |
| /// mod some_lib {
 | |
| ///   pub struct TheirType {
 | |
| ///     pub value: u32
 | |
| ///   }
 | |
| /// }
 | |
| ///
 | |
| /// #[reflect_remote(some_lib::TheirType)]
 | |
| /// struct MyType {
 | |
| ///   pub value: u32
 | |
| /// }
 | |
| ///
 | |
| /// #[derive(Reflect)]
 | |
| /// struct MyStruct {
 | |
| ///   #[reflect(remote = MyType)]
 | |
| ///   data: some_lib::TheirType,
 | |
| /// }
 | |
| /// ```
 | |
| ///
 | |
| /// [reflectable]: Reflect
 | |
| /// [`transmute`]: std::mem::transmute
 | |
| /// [very unsafe]: https://doc.rust-lang.org/1.71.0/nomicon/transmutes.html
 | |
| /// [`FromReflect`]: crate::FromReflect
 | |
| pub trait ReflectRemote: Reflect {
 | |
|     /// The remote type this type represents via reflection.
 | |
|     type Remote;
 | |
| 
 | |
|     /// Converts a reference of this wrapper to a reference of its remote type.
 | |
|     fn as_remote(&self) -> &Self::Remote;
 | |
|     /// Converts a mutable reference of this wrapper to a mutable reference of its remote type.
 | |
|     fn as_remote_mut(&mut self) -> &mut Self::Remote;
 | |
|     /// Converts this wrapper into its remote type.
 | |
|     fn into_remote(self) -> Self::Remote;
 | |
| 
 | |
|     /// Converts a reference of the remote type to a reference of this wrapper.
 | |
|     fn as_wrapper(remote: &Self::Remote) -> &Self;
 | |
|     /// Converts a mutable reference of the remote type to a mutable reference of this wrapper.
 | |
|     fn as_wrapper_mut(remote: &mut Self::Remote) -> &mut Self;
 | |
|     /// Converts the remote type into this wrapper.
 | |
|     fn into_wrapper(remote: Self::Remote) -> Self;
 | |
| }
 |