From 7110c67909e109087c2fe3020548dccb50325e1d Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Thu, 30 Jun 2022 15:00:25 +1000 Subject: [PATCH 1/7] Implement Reflect for PhantomData --- crates/bevy_reflect/src/impls/std.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index 6e94741f638b9..908b13307dd71 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -13,7 +13,7 @@ use std::{ any::Any, borrow::Cow, hash::{Hash, Hasher}, - ops::Range, + ops::Range, marker::PhantomData, }; impl_reflect_value!(bool(Debug, Hash, PartialEq, Serialize, Deserialize)); @@ -37,6 +37,7 @@ impl_reflect_value!(Option Deserialize<'de> + Re impl_reflect_value!(HashSet Deserialize<'de> + Send + Sync + 'static>(Serialize, Deserialize)); impl_reflect_value!(Range Deserialize<'de> + Send + Sync + 'static>(Serialize, Deserialize)); impl_reflect_value!(Duration(Debug, Hash, PartialEq, Serialize, Deserialize)); +impl_reflect_value!(PhantomData); impl_from_reflect_value!(bool); impl_from_reflect_value!(char); @@ -65,6 +66,7 @@ impl_from_reflect_value!( Range Deserialize<'de> + Send + Sync + 'static> ); impl_from_reflect_value!(Duration); +impl_from_reflect_value!(PhantomData); impl Array for Vec { #[inline] From 437479c3e9b870b2b80dc4542ff54558245c2272 Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Thu, 30 Jun 2022 15:12:11 +1000 Subject: [PATCH 2/7] Reformat to appease the CI --- crates/bevy_reflect/src/impls/std.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index 908b13307dd71..8e3c8815c87c2 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -13,7 +13,8 @@ use std::{ any::Any, borrow::Cow, hash::{Hash, Hasher}, - ops::Range, marker::PhantomData, + marker::PhantomData, + ops::Range, }; impl_reflect_value!(bool(Debug, Hash, PartialEq, Serialize, Deserialize)); From 428c0a9ba0b9c87ab4c037d12a1b6dea7cc3a2a5 Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Thu, 30 Jun 2022 17:03:37 +1000 Subject: [PATCH 3/7] Add serializability test for PhantomData --- crates/bevy_reflect/src/impls/std.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index 8e3c8815c87c2..85b518885b8c9 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -38,7 +38,7 @@ impl_reflect_value!(Option Deserialize<'de> + Re impl_reflect_value!(HashSet Deserialize<'de> + Send + Sync + 'static>(Serialize, Deserialize)); impl_reflect_value!(Range Deserialize<'de> + Send + Sync + 'static>(Serialize, Deserialize)); impl_reflect_value!(Duration(Debug, Hash, PartialEq, Serialize, Deserialize)); -impl_reflect_value!(PhantomData); +impl_reflect_value!(PhantomData(Serialize, Deserialize)); impl_from_reflect_value!(bool); impl_from_reflect_value!(char); @@ -594,6 +594,17 @@ mod tests { let _serializable = reflect_serialize.get_serializable(&std::time::Duration::ZERO); } + #[test] + fn can_serialize_phantomdata() { + let mut type_registry = TypeRegistry::default(); + type_registry.register::>(); + + let reflect_serialize = type_registry + .get_type_data::(std::any::TypeId::of::>()) + .unwrap(); + let _serializable = reflect_serialize.get_serializable(&std::marker::PhantomData::<()>); + } + #[test] fn should_partial_eq_char() { let a: &dyn Reflect = &'x'; From bf778adb09a0703ef7ea396b535a7de7e0c578cb Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Thu, 30 Jun 2022 17:08:56 +1000 Subject: [PATCH 4/7] Fix formatting (again) --- crates/bevy_reflect/src/impls/std.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index 85b518885b8c9..0d288518d895b 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -600,7 +600,9 @@ mod tests { type_registry.register::>(); let reflect_serialize = type_registry - .get_type_data::(std::any::TypeId::of::>()) + .get_type_data::( + std::any::TypeId::of::>(), + ) .unwrap(); let _serializable = reflect_serialize.get_serializable(&std::marker::PhantomData::<()>); } From 64786716843a25aeac9b6af1a4020d953b3ed9f2 Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Fri, 1 Jul 2022 14:04:44 +1000 Subject: [PATCH 5/7] Replace the PhantomData reflection test --- crates/bevy_reflect/src/impls/std.rs | 39 +++++++++++++++++++++------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index 0d288518d895b..f33246b52c3cd 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -38,7 +38,7 @@ impl_reflect_value!(Option Deserialize<'de> + Re impl_reflect_value!(HashSet Deserialize<'de> + Send + Sync + 'static>(Serialize, Deserialize)); impl_reflect_value!(Range Deserialize<'de> + Send + Sync + 'static>(Serialize, Deserialize)); impl_reflect_value!(Duration(Debug, Hash, PartialEq, Serialize, Deserialize)); -impl_reflect_value!(PhantomData(Serialize, Deserialize)); +impl_reflect_value!(PhantomData(Debug, Hash, PartialEq, Serialize, Deserialize)); impl_from_reflect_value!(bool); impl_from_reflect_value!(char); @@ -579,8 +579,13 @@ impl FromReflect for Cow<'static, str> { #[cfg(test)] mod tests { + use super::*; + use crate::serde::{ReflectDeserializer, ReflectSerializer}; + use crate::DynamicStruct; use crate::{Reflect, ReflectSerialize, TypeRegistry}; + use ::serde::de::DeserializeSeed; use bevy_utils::HashMap; + use ron::{ser::to_string, Deserializer}; use std::f32::consts::{PI, TAU}; #[test] @@ -596,15 +601,31 @@ mod tests { #[test] fn can_serialize_phantomdata() { - let mut type_registry = TypeRegistry::default(); - type_registry.register::>(); + #[derive(Reflect, PartialEq, Eq, Debug)] + struct Foo { + a: u32, + _phantomdata: PhantomData, + } - let reflect_serialize = type_registry - .get_type_data::( - std::any::TypeId::of::>(), - ) - .unwrap(); - let _serializable = reflect_serialize.get_serializable(&std::marker::PhantomData::<()>); + let foo: Foo = Foo { + a: 1, + _phantomdata: PhantomData, + }; + + let mut registry = TypeRegistry::default(); + registry.register::(); + registry.register::>(); + + let serializer = ReflectSerializer::new(&foo, ®istry); + let serialized = to_string(&serializer).unwrap(); + + let mut deserializer = Deserializer::from_str(&serialized).unwrap(); + let reflect_deserializer = ReflectDeserializer::new(®istry); + let value = reflect_deserializer.deserialize(&mut deserializer).unwrap(); + let dynamic_struct = value.take::().unwrap(); + + assert_eq!(serialized, "{\"type\":\"bevy_reflect::impls::std::tests::can_serialize_phantomdata::Foo\",\"struct\":{\"a\":{\"type\":\"u32\",\"value\":1},\"_phantomdata\":{\"type\":\"core::marker::PhantomData\",\"value\":()}}}"); + assert!(foo.reflect_partial_eq(&dynamic_struct).unwrap()); } #[test] From 1b277aa747daaa219b70d5b0982d2fa8b729c25a Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Fri, 1 Jul 2022 17:13:24 +1000 Subject: [PATCH 6/7] Update crates/bevy_reflect/src/impls/std.rs Co-authored-by: Gino Valente <49806985+MrGVSV@users.noreply.github.com> --- crates/bevy_reflect/src/impls/std.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index f33246b52c3cd..c902e7c4b0252 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -624,7 +624,7 @@ mod tests { let value = reflect_deserializer.deserialize(&mut deserializer).unwrap(); let dynamic_struct = value.take::().unwrap(); - assert_eq!(serialized, "{\"type\":\"bevy_reflect::impls::std::tests::can_serialize_phantomdata::Foo\",\"struct\":{\"a\":{\"type\":\"u32\",\"value\":1},\"_phantomdata\":{\"type\":\"core::marker::PhantomData\",\"value\":()}}}"); + assert_eq!(serialized, r#"{"type":"bevy_reflect::impls::std::tests::can_serialize_phantomdata::Foo","struct":{"a":{"type":"u32","value":1},"_phantomdata":{"type":"core::marker::PhantomData","value":()}}}"#); assert!(foo.reflect_partial_eq(&dynamic_struct).unwrap()); } From a21425ab91e67799df4f9e8b51de6c972a02723a Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Fri, 1 Jul 2022 17:28:21 +1000 Subject: [PATCH 7/7] Fix formatting --- crates/bevy_reflect/src/impls/std.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index c902e7c4b0252..5bcc915ab09e4 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -624,7 +624,10 @@ mod tests { let value = reflect_deserializer.deserialize(&mut deserializer).unwrap(); let dynamic_struct = value.take::().unwrap(); - assert_eq!(serialized, r#"{"type":"bevy_reflect::impls::std::tests::can_serialize_phantomdata::Foo","struct":{"a":{"type":"u32","value":1},"_phantomdata":{"type":"core::marker::PhantomData","value":()}}}"#); + assert_eq!( + serialized, + r#"{"type":"bevy_reflect::impls::std::tests::can_serialize_phantomdata::Foo","struct":{"a":{"type":"u32","value":1},"_phantomdata":{"type":"core::marker::PhantomData","value":()}}}"# + ); assert!(foo.reflect_partial_eq(&dynamic_struct).unwrap()); }