From 6d6868dcd3ef0f2c781c7e55f66fdc8036a5f7d2 Mon Sep 17 00:00:00 2001 From: janis Date: Mon, 22 Sep 2025 14:56:27 +0200 Subject: [PATCH] fix reflect type paths with generic lifetimes --- crates/bevy_reflect/derive/src/derive_data.rs | 14 +++++++------- crates/bevy_reflect/src/lib.rs | 13 ++++++++++++- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/crates/bevy_reflect/derive/src/derive_data.rs b/crates/bevy_reflect/derive/src/derive_data.rs index 826b225debbcb..9b831951af079 100644 --- a/crates/bevy_reflect/derive/src/derive_data.rs +++ b/crates/bevy_reflect/derive/src/derive_data.rs @@ -1238,17 +1238,17 @@ impl<'a> ReflectTypePath<'a> { mut ty_generic_fn: impl FnMut(&TypeParam) -> StringExpr, bevy_reflect_path: &Path, ) -> StringExpr { - let mut params = generics.params.iter().filter_map(|param| match param { - GenericParam::Type(type_param) => Some(ty_generic_fn(type_param)), + let mut params = generics.params.iter().map(|param| match param { + GenericParam::Type(type_param) => ty_generic_fn(type_param), GenericParam::Const(const_param) => { let ident = &const_param.ident; let ty = &const_param.ty; - Some(StringExpr::Owned(quote! { + StringExpr::Owned(quote! { <#ty as #bevy_reflect_path::__macro_exports::alloc_utils::ToString>::to_string(&#ident) - })) + }) } - GenericParam::Lifetime(_) => None, + GenericParam::Lifetime(_) => StringExpr::from_str("'_"), }); params @@ -1269,7 +1269,7 @@ impl<'a> ReflectTypePath<'a> { let ident = self.type_ident().unwrap(); let module_path = self.module_path().unwrap(); - if self.impl_is_generic() { + if !generics.params.is_empty() { let generics = ReflectTypePath::reduce_generics( generics, |TypeParam { ident, .. }| { @@ -1307,7 +1307,7 @@ impl<'a> ReflectTypePath<'a> { Self::External { generics, .. } | Self::Internal { generics, .. } => { let ident = self.type_ident().unwrap(); - if self.impl_is_generic() { + if !generics.params.is_empty() { let generics = ReflectTypePath::reduce_generics( generics, |TypeParam { ident, .. }| { diff --git a/crates/bevy_reflect/src/lib.rs b/crates/bevy_reflect/src/lib.rs index 359b8aaad3b03..a9e888be5f3d2 100644 --- a/crates/bevy_reflect/src/lib.rs +++ b/crates/bevy_reflect/src/lib.rs @@ -2130,7 +2130,18 @@ mod tests { (Type,) => "(Long,)", "(Short,)", (Type, Type) => "(Long, Long)", "(Short, Short)", (Type, Type, Type) => "(Long, Long, Long)", "(Short, Short, Short)", - Cow<'static, Type> => "alloc::borrow::Cow", "Cow", + Cow<'static, Type> => "alloc::borrow::Cow<'_, Long>", "Cow<'_, Short>", + } + + #[expect( + dead_code, + reason = "field 0 carries the lifetime which is used in the type path" + )] + #[derive(TypePath)] + struct WithLifetime<'a>(&'a ()); + + assert_type_paths! { + WithLifetime<'static> => "bevy_reflect::tests::WithLifetime<'_>", "WithLifetime<'_>", } }