From 9ad130f1e9545856547f1ab4b74611776076c561 Mon Sep 17 00:00:00 2001 From: Benjamin Brienen Date: Thu, 19 Sep 2024 21:52:33 +0200 Subject: [PATCH 1/4] implementation --- crates/bevy_reflect/src/impls/std.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index 85f63be654340..33db654ae5551 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -15,6 +15,7 @@ use crate::{ TypeRegistration, TypeRegistry, Typed, ValueInfo, }; use bevy_reflect_derive::{impl_reflect, impl_reflect_value}; +use core::marker::PhantomData; use std::fmt; use std::{ any::Any, @@ -1484,6 +1485,11 @@ impl_reflect! { } } +impl_reflect! { + #[type_path = "core::marker"] + struct PhantomData; +} + impl TypePath for &'static T { fn type_path() -> &'static str { static CELL: GenericTypePathCell = GenericTypePathCell::new(); From c9bcc69266f7e4d7dd20249fffc55a60aa86b46b Mon Sep 17 00:00:00 2001 From: Benjamin Brienen Date: Thu, 19 Sep 2024 23:14:10 +0200 Subject: [PATCH 2/4] better impl --- crates/bevy_reflect/src/impls/std.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index 33db654ae5551..72cedace371cb 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -15,7 +15,7 @@ use crate::{ TypeRegistration, TypeRegistry, Typed, ValueInfo, }; use bevy_reflect_derive::{impl_reflect, impl_reflect_value}; -use core::marker::PhantomData; + use std::fmt; use std::{ any::Any, @@ -100,6 +100,7 @@ impl_reflect_value!(::std::path::PathBuf( Deserialize, Default )); +impl_reflect_value!(::core::marker::PhantomData); impl_reflect_value!(::std::any::TypeId(Debug, Hash, PartialEq,)); impl_reflect_value!(::std::collections::BTreeSet()); impl_reflect_value!(::core::ops::Range()); @@ -1485,11 +1486,6 @@ impl_reflect! { } } -impl_reflect! { - #[type_path = "core::marker"] - struct PhantomData; -} - impl TypePath for &'static T { fn type_path() -> &'static str { static CELL: GenericTypePathCell = GenericTypePathCell::new(); From 37421758245b2b3f056a2250fd7dd9086135cf06 Mon Sep 17 00:00:00 2001 From: Benjamin Brienen Date: Thu, 19 Sep 2024 23:26:05 +0200 Subject: [PATCH 3/4] test --- crates/bevy_reflect/src/serde/mod.rs | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/crates/bevy_reflect/src/serde/mod.rs b/crates/bevy_reflect/src/serde/mod.rs index bc3137d0b2b55..069f332fe0a0c 100644 --- a/crates/bevy_reflect/src/serde/mod.rs +++ b/crates/bevy_reflect/src/serde/mod.rs @@ -14,6 +14,7 @@ mod tests { type_registry::TypeRegistry, DynamicStruct, FromReflect, Reflect, }; + use bevy_reflect_derive::TypePath; use serde::de::DeserializeSeed; #[test] @@ -179,6 +180,44 @@ mod tests { let expected = value.clone_value(); let result = reflect_deserializer.deserialize(&mut deserializer).unwrap(); + assert!(expected + .reflect_partial_eq(result.as_partial_reflect()) + .unwrap()); + } + #[test] + fn should_roundtrip_phantom_data() { + use core::marker::PhantomData; + + #[derive(Reflect)] + struct TestStruct<'a, T> { + a: i32, + _marker: PhantomData<&'a T>, + } + + #[derive(TypePath)] + struct MarkerType; + + let mut registry = TypeRegistry::default(); + registry.register::>(); + + let value: DynamicStruct = TestStruct::<'static, MarkerType> { + a: 123, + _marker: PhantomData, + } + .clone_dynamic(); + + let serializer = ReflectSerializer::new(&value, ®istry); + + let expected = r#"{"bevy_reflect::serde::tests::TestStruct":(a:123)}"#; + let result = ron::ser::to_string(&serializer).unwrap(); + assert_eq!(expected, result); + + let mut deserializer = ron::de::Deserializer::from_str(&result).unwrap(); + let reflect_deserializer = ReflectDeserializer::new(®istry); + + let expected = value.clone_value(); + let result = reflect_deserializer.deserialize(&mut deserializer).unwrap(); + assert!(expected .reflect_partial_eq(result.as_partial_reflect()) .unwrap()); From bdb33dbcd12a7ef39768893fcd9b3d050a2f3af5 Mon Sep 17 00:00:00 2001 From: Benjamin Brienen Date: Fri, 20 Sep 2024 22:11:39 +0200 Subject: [PATCH 4/4] unit test still failing --- crates/bevy_reflect/src/serde/mod.rs | 51 +++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/crates/bevy_reflect/src/serde/mod.rs b/crates/bevy_reflect/src/serde/mod.rs index 069f332fe0a0c..0a39a6e25c480 100644 --- a/crates/bevy_reflect/src/serde/mod.rs +++ b/crates/bevy_reflect/src/serde/mod.rs @@ -184,21 +184,22 @@ mod tests { .reflect_partial_eq(result.as_partial_reflect()) .unwrap()); } + #[test] - fn should_roundtrip_phantom_data() { + fn should_roundtrip_ref_phantom_data() { use core::marker::PhantomData; - #[derive(Reflect)] + #[derive(Reflect, ::serde::Serialize, ::serde::Deserialize)] struct TestStruct<'a, T> { a: i32, _marker: PhantomData<&'a T>, } - #[derive(TypePath)] + #[derive(Reflect)] struct MarkerType; let mut registry = TypeRegistry::default(); - registry.register::>(); + registry.register::>(); let value: DynamicStruct = TestStruct::<'static, MarkerType> { a: 123, @@ -222,4 +223,46 @@ mod tests { .reflect_partial_eq(result.as_partial_reflect()) .unwrap()); } + + #[test] + fn should_roundtrip_phantom_data() { + use core::marker::PhantomData; + + #[derive(Reflect, ::serde::Serialize, ::serde::Deserialize)] + struct TestStruct { + a: i32, + _marker: PhantomData, + } + + #[derive(Reflect)] + struct MarkerType; + + let mut registry = TypeRegistry::default(); + registry.register::>(); + registry.register::>(); + registry.register_type_data::, crate::ReflectDeserialize>(); + registry.register_type_data::, crate::ReflectDeserialize>(); + + let value: DynamicStruct = TestStruct:: { + a: 123, + _marker: PhantomData, + } + .clone_dynamic(); + + let serializer = ReflectSerializer::new(&value, ®istry); + + let expected = r#"{"bevy_reflect::serde::tests::TestStruct":(a:123)}"#; + let result = ron::ser::to_string(&serializer).unwrap(); + assert_eq!(expected, result); + + let mut deserializer = ron::de::Deserializer::from_str(&result).unwrap(); + let reflect_deserializer = ReflectDeserializer::new(®istry); + + let expected = value.clone_value(); + let result = reflect_deserializer.deserialize(&mut deserializer).unwrap(); + + assert!(expected + .reflect_partial_eq(result.as_partial_reflect()) + .unwrap()); + } }