Skip to content

Commit 02fbf16

Browse files
committed
bevy_reflect: Add Reflect::into_reflect (#6502)
# Objective Using `Reflect` we can easily switch between a specific reflection trait object, such as a `dyn Struct`, to a `dyn Reflect` object via `Reflect::as_reflect` or `Reflect::as_reflect_mut`. ```rust fn do_something(value: &dyn Reflect) {/* ... */} let foo: Box<dyn Struct> = Box::new(Foo::default()); do_something(foo.as_reflect()); ``` However, there is no way to convert a _boxed_ reflection trait object to a `Box<dyn Reflect>`. ## Solution Add a `Reflect::into_reflect` method which allows converting a boxed reflection trait object back into a boxed `Reflect` trait object. ```rust fn do_something(value: Box<dyn Reflect>) {/* ... */} let foo: Box<dyn Struct> = Box::new(Foo::default()); do_something(foo.into_reflect()); ``` --- ## Changelog - Added `Reflect::into_reflect`
1 parent 33299f0 commit 02fbf16

File tree

17 files changed

+109
-2
lines changed

17 files changed

+109
-2
lines changed

crates/bevy_reflect/bevy_reflect_derive/src/impls/enums.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@ pub(crate) fn impl_enum(reflect_enum: &ReflectEnum) -> TokenStream {
202202
self
203203
}
204204

205+
#[inline]
206+
fn into_reflect(self: Box<Self>) -> Box<dyn #bevy_reflect_path::Reflect> {
207+
self
208+
}
209+
205210
#[inline]
206211
fn as_reflect(&self) -> &dyn #bevy_reflect_path::Reflect {
207212
self

crates/bevy_reflect/bevy_reflect_derive/src/impls/structs.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,11 @@ pub(crate) fn impl_struct(reflect_struct: &ReflectStruct) -> TokenStream {
183183
self
184184
}
185185

186+
#[inline]
187+
fn into_reflect(self: Box<Self>) -> Box<dyn #bevy_reflect_path::Reflect> {
188+
self
189+
}
190+
186191
#[inline]
187192
fn as_reflect(&self) -> &dyn #bevy_reflect_path::Reflect {
188193
self

crates/bevy_reflect/bevy_reflect_derive/src/impls/tuple_structs.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ pub(crate) fn impl_tuple_struct(reflect_struct: &ReflectStruct) -> TokenStream {
145145
self
146146
}
147147

148+
#[inline]
149+
fn into_reflect(self: Box<Self>) -> Box<dyn #bevy_reflect_path::Reflect> {
150+
self
151+
}
152+
148153
#[inline]
149154
fn as_reflect(&self) -> &dyn #bevy_reflect_path::Reflect {
150155
self

crates/bevy_reflect/bevy_reflect_derive/src/impls/values.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ pub(crate) fn impl_value(meta: &ReflectMeta) -> TokenStream {
6464
self
6565
}
6666

67+
#[inline]
68+
fn into_reflect(self: Box<Self>) -> Box<dyn #bevy_reflect_path::Reflect> {
69+
self
70+
}
71+
6772
#[inline]
6873
fn as_reflect(&self) -> &dyn #bevy_reflect_path::Reflect {
6974
self

crates/bevy_reflect/src/array.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,11 @@ impl Reflect for DynamicArray {
197197
self
198198
}
199199

200+
#[inline]
201+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
202+
self
203+
}
204+
200205
#[inline]
201206
fn as_reflect(&self) -> &dyn Reflect {
202207
self

crates/bevy_reflect/src/enums/dynamic_enum.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,11 @@ impl Reflect for DynamicEnum {
315315
self
316316
}
317317

318+
#[inline]
319+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
320+
self
321+
}
322+
318323
#[inline]
319324
fn as_reflect(&self) -> &dyn Reflect {
320325
self

crates/bevy_reflect/src/impls/smallvec.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ where
9090
self
9191
}
9292

93+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
94+
self
95+
}
96+
9397
fn as_reflect(&self) -> &dyn Reflect {
9498
self
9599
}

crates/bevy_reflect/src/impls/std.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@ impl<T: FromReflect> Reflect for Vec<T> {
245245
self
246246
}
247247

248+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
249+
self
250+
}
251+
248252
fn as_reflect(&self) -> &dyn Reflect {
249253
self
250254
}
@@ -413,6 +417,11 @@ impl<K: FromReflect + Eq + Hash, V: FromReflect> Reflect for HashMap<K, V> {
413417
self
414418
}
415419

420+
#[inline]
421+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
422+
self
423+
}
424+
416425
fn as_reflect(&self) -> &dyn Reflect {
417426
self
418427
}
@@ -543,6 +552,11 @@ impl<T: Reflect, const N: usize> Reflect for [T; N] {
543552
self
544553
}
545554

555+
#[inline]
556+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
557+
self
558+
}
559+
546560
#[inline]
547561
fn as_reflect(&self) -> &dyn Reflect {
548562
self
@@ -661,6 +675,10 @@ impl Reflect for Cow<'static, str> {
661675
self
662676
}
663677

678+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
679+
self
680+
}
681+
664682
fn as_reflect(&self) -> &dyn Reflect {
665683
self
666684
}
@@ -819,6 +837,11 @@ impl<T: FromReflect> Reflect for Option<T> {
819837
self
820838
}
821839

840+
#[inline]
841+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
842+
self
843+
}
844+
822845
fn as_reflect(&self) -> &dyn Reflect {
823846
self
824847
}

crates/bevy_reflect/src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,21 @@ mod tests {
989989
}
990990
}
991991

992+
#[test]
993+
fn into_reflect() {
994+
trait TestTrait: Reflect {}
995+
996+
#[derive(Reflect)]
997+
struct TestStruct;
998+
999+
impl TestTrait for TestStruct {}
1000+
1001+
let trait_object: Box<dyn TestTrait> = Box::new(TestStruct);
1002+
1003+
// Should compile:
1004+
let _ = trait_object.into_reflect();
1005+
}
1006+
9921007
#[test]
9931008
fn as_reflect() {
9941009
trait TestTrait: Reflect {}

crates/bevy_reflect/src/list.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ impl Reflect for DynamicList {
216216
self
217217
}
218218

219+
#[inline]
220+
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect> {
221+
self
222+
}
223+
219224
#[inline]
220225
fn as_reflect(&self) -> &dyn Reflect {
221226
self

0 commit comments

Comments
 (0)