From 9881cebb21fb7fc02e9c8eefe1cb6e2e4b5ee41d Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Thu, 22 Sep 2022 13:35:36 +0200 Subject: [PATCH 1/4] add test that asserts that all types used in registered types are registered as well --- tests/check_types_registered.rs | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/check_types_registered.rs diff --git a/tests/check_types_registered.rs b/tests/check_types_registered.rs new file mode 100644 index 0000000000000..ca8f2d0bb36c9 --- /dev/null +++ b/tests/check_types_registered.rs @@ -0,0 +1,69 @@ +use std::any::TypeId; + +use bevy::{ + prelude::*, + reflect::{TypeInfo, TypeRegistryInternal, VariantInfo}, +}; + +#[test] +fn check_types_registered_recursive() { + let mut app = App::new(); + app.add_plugins_with(DefaultPlugins, |g| g.disable::()); + + let type_registry = app.world.resource::(); + let type_registry = type_registry.read(); + + for registration in type_registry.iter() { + assert_registered_recursive( + &*type_registry, + registration.type_id(), + registration.type_name(), + ); + } +} + +fn assert_registered_recursive( + type_registry: &TypeRegistryInternal, + type_id: TypeId, + name: &'static str, +) { + let registration = type_registry + .get(type_id) + .unwrap_or_else(|| panic!("{name} is not registered")); + match registration.type_info() { + TypeInfo::Struct(info) => info.iter().for_each(|field| { + assert_registered_recursive(type_registry, field.type_id(), field.type_name()) + }), + TypeInfo::TupleStruct(info) => info.iter().for_each(|field| { + assert_registered_recursive(type_registry, field.type_id(), field.type_name()) + }), + TypeInfo::Tuple(info) => info.iter().for_each(|field| { + assert_registered_recursive(type_registry, field.type_id(), field.type_name()) + }), + TypeInfo::List(info) => { + assert_registered_recursive(type_registry, info.item_type_id(), info.item_type_name()) + } + TypeInfo::Array(info) => { + assert_registered_recursive(type_registry, info.item_type_id(), info.item_type_name()) + } + TypeInfo::Map(info) => { + assert_registered_recursive(type_registry, info.key_type_id(), info.key_type_name()); + assert_registered_recursive( + type_registry, + info.value_type_id(), + info.value_type_name(), + ); + } + TypeInfo::Enum(info) => info.iter().for_each(|variant| match variant { + VariantInfo::Struct(variant) => variant.iter().for_each(|field| { + assert_registered_recursive(type_registry, field.type_id(), field.type_name()) + }), + VariantInfo::Tuple(variant) => variant.iter().for_each(|field| { + assert_registered_recursive(type_registry, field.type_id(), field.type_name()) + }), + VariantInfo::Unit(_) => {} + }), + TypeInfo::Value(_) => {} + TypeInfo::Dynamic(_) => todo!(), + } +} From f7e38b022144c7881aff323a706d19ed538e0bf9 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Thu, 22 Sep 2022 13:37:52 +0200 Subject: [PATCH 2/4] register missing types --- crates/bevy_core/src/lib.rs | 12 +++++++++--- crates/bevy_hierarchy/src/lib.rs | 2 ++ crates/bevy_render/src/camera/mod.rs | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/bevy_core/src/lib.rs b/crates/bevy_core/src/lib.rs index 7cc0735c98503..95ed215f272cb 100644 --- a/crates/bevy_core/src/lib.rs +++ b/crates/bevy_core/src/lib.rs @@ -33,7 +33,9 @@ impl Plugin for CorePlugin { .unwrap_or_default() .create_default_pools(); - app.register_type::().register_type::(); + app.register_type::() + .register_type::>() + .register_type::(); register_rust_types(app); register_math_types(app); @@ -47,7 +49,8 @@ fn register_rust_types(app: &mut App) { .register_type::>() .register_type::>() .register_type::() - .register_type::(); + .register_type::() + .register_type::>(); } fn register_math_types(app: &mut App) { @@ -81,5 +84,8 @@ fn register_math_types(app: &mut App) { .register_type::() .register_type::() .register_type::() - .register_type::(); + .register_type::() + .register_type::() + .register_type::>() + .register_type::>(); } diff --git a/crates/bevy_hierarchy/src/lib.rs b/crates/bevy_hierarchy/src/lib.rs index 1f8c08d9c76c4..a85e6fb74903c 100644 --- a/crates/bevy_hierarchy/src/lib.rs +++ b/crates/bevy_hierarchy/src/lib.rs @@ -17,6 +17,7 @@ mod events; pub use events::*; mod valid_parent_check_plugin; +use smallvec::SmallVec; pub use valid_parent_check_plugin::*; #[doc(hidden)] @@ -36,6 +37,7 @@ pub struct HierarchyPlugin; impl Plugin for HierarchyPlugin { fn build(&self, app: &mut App) { app.register_type::() + .register_type::>() .register_type::() .add_event::(); } diff --git a/crates/bevy_render/src/camera/mod.rs b/crates/bevy_render/src/camera/mod.rs index fbaed28a8f3ae..b96aeb9a5047b 100644 --- a/crates/bevy_render/src/camera/mod.rs +++ b/crates/bevy_render/src/camera/mod.rs @@ -22,6 +22,7 @@ impl Plugin for CameraPlugin { fn build(&self, app: &mut App) { app.register_type::() .register_type::() + .register_type::>() .register_type::() .register_type::() .register_type::() From 846e3f5e4751e203614fd67ba1946266a915d934 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Thu, 22 Sep 2022 13:47:25 +0200 Subject: [PATCH 3/4] check that all registered resources/components have their ReflectResource/ReflectComponent registered --- tests/check_types_registered.rs | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/check_types_registered.rs b/tests/check_types_registered.rs index ca8f2d0bb36c9..f956fe2d3786a 100644 --- a/tests/check_types_registered.rs +++ b/tests/check_types_registered.rs @@ -5,6 +5,42 @@ use bevy::{ reflect::{TypeInfo, TypeRegistryInternal, VariantInfo}, }; +#[test] +fn check_components_resources_registered() { + let mut app = App::new(); + app.add_plugins_with(DefaultPlugins, |g| g.disable::()); + + let type_registry = app.world.resource::(); + let type_registry = type_registry.read(); + + for registration in app + .world + .components() + .iter() + .filter_map(|info| info.type_id()) + .filter_map(|type_id| type_registry.get(type_id)) + { + if app + .world + .components() + .get_resource_id(registration.type_id()) + .is_some() + { + assert!( + registration.data::().is_some(), + "resource {} has no `ReflectResource`", + registration.short_name() + ); + } else { + assert!( + registration.data::().is_some(), + "component {} has no `ReflectComponent`", + registration.short_name() + ); + } + } +} + #[test] fn check_types_registered_recursive() { let mut app = App::new(); From 18326b676d78392e5204cbe863f213bf2b7641b5 Mon Sep 17 00:00:00 2001 From: Jakob Hellermann Date: Thu, 22 Sep 2022 16:00:09 +0200 Subject: [PATCH 4/4] disable log plugin --- tests/check_types_registered.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/check_types_registered.rs b/tests/check_types_registered.rs index f956fe2d3786a..0071bccf31eab 100644 --- a/tests/check_types_registered.rs +++ b/tests/check_types_registered.rs @@ -8,7 +8,7 @@ use bevy::{ #[test] fn check_components_resources_registered() { let mut app = App::new(); - app.add_plugins_with(DefaultPlugins, |g| g.disable::()); + app.add_plugins_with(DefaultPlugins, |g| g.disable::().disable::()); let type_registry = app.world.resource::(); let type_registry = type_registry.read(); @@ -44,7 +44,7 @@ fn check_components_resources_registered() { #[test] fn check_types_registered_recursive() { let mut app = App::new(); - app.add_plugins_with(DefaultPlugins, |g| g.disable::()); + app.add_plugins_with(DefaultPlugins, |g| g.disable::().disable::()); let type_registry = app.world.resource::(); let type_registry = type_registry.read();