From 2fe866b0e5463ca792504676965adce3d93256c3 Mon Sep 17 00:00:00 2001 From: Christian Hughes Date: Wed, 27 Sep 2023 22:48:11 -0500 Subject: [PATCH 1/3] Remove States::variants and its associated type --- crates/bevy_ecs/macros/src/states.rs | 10 +--------- crates/bevy_ecs/src/schedule/state.rs | 8 +------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/crates/bevy_ecs/macros/src/states.rs b/crates/bevy_ecs/macros/src/states.rs index b80a5b6ff1503..4551b7aa1168f 100644 --- a/crates/bevy_ecs/macros/src/states.rs +++ b/crates/bevy_ecs/macros/src/states.rs @@ -28,17 +28,9 @@ pub fn derive_states(input: TokenStream) -> TokenStream { trait_path.segments.push(format_ident!("schedule").into()); trait_path.segments.push(format_ident!("States").into()); let struct_name = &ast.ident; - let idents = enumeration.variants.iter().map(|v| &v.ident); - let len = idents.len(); quote! { - impl #impl_generics #trait_path for #struct_name #ty_generics #where_clause { - type Iter = std::array::IntoIter; - - fn variants() -> Self::Iter { - [#(Self::#idents,)*].into_iter() - } - } + impl #impl_generics #trait_path for #struct_name #ty_generics #where_clause {} } .into() } diff --git a/crates/bevy_ecs/src/schedule/state.rs b/crates/bevy_ecs/src/schedule/state.rs index a60bffdb82ee4..a39f8cc036d1d 100644 --- a/crates/bevy_ecs/src/schedule/state.rs +++ b/crates/bevy_ecs/src/schedule/state.rs @@ -40,13 +40,7 @@ pub use bevy_ecs_macros::States; /// } /// /// ``` -pub trait States: 'static + Send + Sync + Clone + PartialEq + Eq + Hash + Debug + Default { - /// The type returned when iterating over all [`variants`](States::variants) of this type. - type Iter: Iterator; - - /// Returns an iterator over all the state variants. - fn variants() -> Self::Iter; -} +pub trait States: 'static + Send + Sync + Clone + PartialEq + Eq + Hash + Debug + Default {} /// The label of a [`Schedule`](super::Schedule) that runs whenever [`State`] /// enters this state. From 4a3802c135ef336ababbf1130518cf74a97b1efb Mon Sep 17 00:00:00 2001 From: Christian Hughes Date: Wed, 27 Sep 2023 22:48:41 -0500 Subject: [PATCH 2/3] Remove enums-only restriction on States derive --- crates/bevy_ecs/macros/src/states.rs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/crates/bevy_ecs/macros/src/states.rs b/crates/bevy_ecs/macros/src/states.rs index 4551b7aa1168f..0eb516c31563d 100644 --- a/crates/bevy_ecs/macros/src/states.rs +++ b/crates/bevy_ecs/macros/src/states.rs @@ -1,26 +1,11 @@ -use proc_macro::{Span, TokenStream}; +use proc_macro::TokenStream; use quote::{format_ident, quote}; -use syn::{parse_macro_input, Data::Enum, DeriveInput}; +use syn::{parse_macro_input, DeriveInput}; use crate::bevy_ecs_path; pub fn derive_states(input: TokenStream) -> TokenStream { let ast = parse_macro_input!(input as DeriveInput); - let error = || { - syn::Error::new( - Span::call_site().into(), - "derive(States) only supports fieldless enums", - ) - .into_compile_error() - .into() - }; - let Enum(enumeration) = ast.data else { - return error(); - }; - if enumeration.variants.iter().any(|v| !v.fields.is_empty()) { - return error(); - } - let generics = ast.generics; let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); From 68a5abac5bb02f713ca8305bc789d03e36014e4a Mon Sep 17 00:00:00 2001 From: Christian Hughes Date: Thu, 28 Sep 2023 10:46:49 -0500 Subject: [PATCH 3/3] Make sure TestState::B gets used --- crates/bevy_ecs/src/schedule/condition.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/schedule/condition.rs b/crates/bevy_ecs/src/schedule/condition.rs index 819dfe448fec6..92bd416300012 100644 --- a/crates/bevy_ecs/src/schedule/condition.rs +++ b/crates/bevy_ecs/src/schedule/condition.rs @@ -1190,7 +1190,7 @@ mod tests { .distributive_run_if(resource_changed_or_removed::>()) .distributive_run_if(resource_removed::>()) .distributive_run_if(state_exists::()) - .distributive_run_if(in_state(TestState::A)) + .distributive_run_if(in_state(TestState::A).or_else(in_state(TestState::B))) .distributive_run_if(state_changed::()) .distributive_run_if(on_event::()) .distributive_run_if(any_with_component::())