Skip to content

Commit fcecaa0

Browse files
Refactored out ComponentId in Event trait
1 parent 2b12300 commit fcecaa0

File tree

5 files changed

+47
-44
lines changed

5 files changed

+47
-44
lines changed

crates/bevy_ecs/src/event/base.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,23 @@ use core::{
9494
note = "consider annotating `{Self}` with `#[derive(Event)]`"
9595
)]
9696
pub trait Event: Send + Sync + 'static {
97-
/// Generates the [`ComponentId`] for this event type.
97+
/// Generates the [`EventKey`] for this event type.
9898
///
9999
/// If this type has already been registered,
100-
/// this will return the existing [`ComponentId`].
100+
/// this will return the existing [`EventKey`].
101101
///
102102
/// This is used by various dynamically typed observer APIs,
103103
/// such as [`World::trigger_targets_dynamic`].
104104
///
105105
/// # Warning
106106
///
107107
/// This method should not be overridden by implementers,
108-
/// and should always correspond to the implementation of [`event_key`](Event::component_id).
109-
fn register_component_id(world: &mut World) -> ComponentId {
110-
world.register_component::<EventWrapperComponent<Self>>()
108+
/// and should always correspond to the implementation of [`event_type`](Event::event_type).
109+
fn register_event_type(world: &mut World) -> EventKey {
110+
EventKey(world.register_component::<EventWrapperComponent<Self>>())
111111
}
112112

113-
/// Fetches the [`ComponentId`] for this event type,
113+
/// Fetches the [`EventKey`] for this event type,
114114
/// if it has already been generated.
115115
///
116116
/// This is used by various dynamically typed observer APIs,
@@ -119,9 +119,12 @@ pub trait Event: Send + Sync + 'static {
119119
/// # Warning
120120
///
121121
/// This method should not be overridden by implementers,
122-
/// and should always correspond to the implementation of [`register_component_id`](Event::register_component_id).
123-
fn component_id(world: &World) -> Option<ComponentId> {
124-
world.component_id::<EventWrapperComponent<Self>>()
122+
/// and should always correspond to the implementation of
123+
/// [`register_event_type`](Event::register_event_type).
124+
fn event_type(world: &World) -> Option<EventKey> {
125+
world
126+
.component_id::<EventWrapperComponent<Self>>()
127+
.map(EventKey)
125128
}
126129
}
127130

crates/bevy_ecs/src/observer/mod.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -786,10 +786,10 @@ impl World {
786786
}
787787

788788
pub(crate) fn trigger_with_caller<E: Event>(&mut self, mut event: E, caller: MaybeLocation) {
789-
let event_id = E::register_component_id(self);
789+
let event_type = E::register_event_type(self);
790790
// SAFETY: We just registered `event_id` with the type of `event`
791791
unsafe {
792-
self.trigger_dynamic_ref_with_caller(event_id, &mut event, caller);
792+
self.trigger_dynamic_ref_with_caller(event_type, &mut event, caller);
793793
}
794794
}
795795

@@ -799,22 +799,22 @@ impl World {
799799
/// or use the event after it has been modified by observers.
800800
#[track_caller]
801801
pub fn trigger_ref<E: Event>(&mut self, event: &mut E) {
802-
let event_id = E::register_component_id(self);
802+
let event_type = E::register_event_type(self);
803803
// SAFETY: We just registered `event_id` with the type of `event`
804-
unsafe { self.trigger_dynamic_ref_with_caller(event_id, event, MaybeLocation::caller()) };
804+
unsafe { self.trigger_dynamic_ref_with_caller(event_type, event, MaybeLocation::caller()) };
805805
}
806806

807807
unsafe fn trigger_dynamic_ref_with_caller<E: Event>(
808808
&mut self,
809-
event_id: ComponentId,
809+
event_type: EventKey,
810810
event_data: &mut E,
811811
caller: MaybeLocation,
812812
) {
813813
let mut world = DeferredWorld::from(self);
814814
// SAFETY: `event_data` is accessible as the type represented by `event_id`
815815
unsafe {
816816
world.trigger_observers_with_data::<_, ()>(
817-
EventKey(event_id),
817+
event_type,
818818
None,
819819
None,
820820
core::iter::empty::<ComponentId>(),
@@ -841,10 +841,10 @@ impl World {
841841
targets: impl TriggerTargets,
842842
caller: MaybeLocation,
843843
) {
844-
let event_id = E::register_component_id(self);
844+
let event_type = E::register_event_type(self);
845845
// SAFETY: We just registered `event_id` with the type of `event`
846846
unsafe {
847-
self.trigger_targets_dynamic_ref_with_caller(event_id, &mut event, targets, caller);
847+
self.trigger_targets_dynamic_ref_with_caller(event_type, &mut event, targets, caller);
848848
}
849849
}
850850

@@ -859,9 +859,9 @@ impl World {
859859
event: &mut E,
860860
targets: impl TriggerTargets,
861861
) {
862-
let event_id = E::register_component_id(self);
862+
let event_type = E::register_event_type(self);
863863
// SAFETY: We just registered `event_id` with the type of `event`
864-
unsafe { self.trigger_targets_dynamic_ref(event_id, event, targets) };
864+
unsafe { self.trigger_targets_dynamic_ref(event_type, event, targets) };
865865
}
866866

867867
/// Triggers the given [`EntityEvent`] for the given `targets`, which will run any [`Observer`]s watching for it.
@@ -876,13 +876,13 @@ impl World {
876876
#[track_caller]
877877
pub unsafe fn trigger_targets_dynamic<E: EntityEvent, Targets: TriggerTargets>(
878878
&mut self,
879-
event_id: ComponentId,
879+
event_type: EventKey,
880880
mut event_data: E,
881881
targets: Targets,
882882
) {
883883
// SAFETY: `event_data` is accessible as the type represented by `event_id`
884884
unsafe {
885-
self.trigger_targets_dynamic_ref(event_id, &mut event_data, targets);
885+
self.trigger_targets_dynamic_ref(event_type, &mut event_data, targets);
886886
};
887887
}
888888

@@ -898,12 +898,12 @@ impl World {
898898
#[track_caller]
899899
pub unsafe fn trigger_targets_dynamic_ref<E: EntityEvent, Targets: TriggerTargets>(
900900
&mut self,
901-
event_id: ComponentId,
901+
event_type: EventKey,
902902
event_data: &mut E,
903903
targets: Targets,
904904
) {
905905
self.trigger_targets_dynamic_ref_with_caller(
906-
event_id,
906+
event_type,
907907
event_data,
908908
targets,
909909
MaybeLocation::caller(),
@@ -915,7 +915,7 @@ impl World {
915915
/// See `trigger_targets_dynamic_ref`
916916
unsafe fn trigger_targets_dynamic_ref_with_caller<E: EntityEvent, Targets: TriggerTargets>(
917917
&mut self,
918-
event_id: ComponentId,
918+
event_type: EventKey,
919919
event_data: &mut E,
920920
targets: Targets,
921921
caller: MaybeLocation,
@@ -926,7 +926,7 @@ impl World {
926926
// SAFETY: `event_data` is accessible as the type represented by `event_id`
927927
unsafe {
928928
world.trigger_observers_with_data::<_, E::Traversal>(
929-
EventKey(event_id),
929+
event_type,
930930
None,
931931
None,
932932
targets.components(),
@@ -940,7 +940,7 @@ impl World {
940940
// SAFETY: `event_data` is accessible as the type represented by `event_id`
941941
unsafe {
942942
world.trigger_observers_with_data::<_, E::Traversal>(
943-
EventKey(event_id),
943+
event_type,
944944
Some(target_entity),
945945
Some(target_entity),
946946
targets.components(),
@@ -1323,14 +1323,14 @@ mod tests {
13231323
fn observer_multiple_events() {
13241324
let mut world = World::new();
13251325
world.init_resource::<Order>();
1326-
let on_remove = Remove::register_component_id(&mut world);
1326+
let on_remove = Remove::register_event_type(&mut world);
13271327
world.spawn(
13281328
// SAFETY: Add and Remove are both unit types, so this is safe
13291329
unsafe {
13301330
Observer::new(|_: On<Add, A>, mut res: ResMut<Order>| {
13311331
res.observed("add/remove");
13321332
})
1333-
.with_event(EventKey(on_remove))
1333+
.with_event(on_remove)
13341334
},
13351335
);
13361336

@@ -1597,14 +1597,14 @@ mod tests {
15971597
fn observer_dynamic_trigger() {
15981598
let mut world = World::new();
15991599
world.init_resource::<Order>();
1600-
let event_a = Remove::register_component_id(&mut world);
1600+
let event_a = Remove::register_event_type(&mut world);
16011601

16021602
// SAFETY: we registered `event_a` above and it matches the type of EventA
16031603
let observe = unsafe {
16041604
Observer::with_dynamic_runner(|mut world, _trigger, _ptr, _propagate| {
16051605
world.resource_mut::<Order>().observed("event_a");
16061606
})
1607-
.with_event(EventKey(event_a))
1607+
.with_event(event_a)
16081608
};
16091609
world.spawn(observe);
16101610

crates/bevy_ecs/src/observer/runner.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,13 +443,13 @@ fn hook_on_add<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
443443
HookContext { entity, .. }: HookContext,
444444
) {
445445
world.commands().queue(move |world: &mut World| {
446-
let event_id = E::register_component_id(world);
446+
let event_type = E::register_event_type(world);
447447
let mut components = vec![];
448448
B::component_ids(&mut world.components_registrator(), &mut |id| {
449449
components.push(id);
450450
});
451451
if let Some(mut observer) = world.get_mut::<Observer>(entity) {
452-
observer.descriptor.events.push(EventKey(event_id));
452+
observer.descriptor.events.push(event_type);
453453
observer.descriptor.components.extend(components);
454454

455455
let system: &mut dyn Any = observer.system.as_mut();

crates/bevy_ecs/src/world/deferred_world.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ impl<'w> DeferredWorld<'w> {
804804
}
805805
Observers::invoke::<_>(
806806
self.reborrow(),
807-
event.clone(),
807+
event,
808808
Some(current_target),
809809
original_target,
810810
components.clone(),

crates/bevy_ecs/src/world/mod.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::{
2121
error::{DefaultErrorHandler, ErrorHandler},
2222
event::BufferedEvent,
2323
lifecycle::{ComponentHooks, ADD, DESPAWN, INSERT, REMOVE, REPLACE},
24-
prelude::{Add, Despawn, EventKey, Insert, Remove, Replace},
24+
prelude::{Add, Despawn, Insert, Remove, Replace},
2525
};
2626
pub use bevy_ecs_macros::FromWorld;
2727
use bevy_utils::prelude::DebugName;
@@ -152,20 +152,20 @@ impl World {
152152
#[inline]
153153
fn bootstrap(&mut self) {
154154
// The order that we register these events is vital to ensure that the constants are correct!
155-
let on_add = Add::register_component_id(self);
156-
assert_eq!(ADD, EventKey(on_add));
155+
let on_add = Add::register_event_type(self);
156+
assert_eq!(ADD, on_add);
157157

158-
let on_insert = Insert::register_component_id(self);
159-
assert_eq!(INSERT, EventKey(on_insert));
158+
let on_insert = Insert::register_event_type(self);
159+
assert_eq!(INSERT, on_insert);
160160

161-
let on_replace = Replace::register_component_id(self);
162-
assert_eq!(REPLACE, EventKey(on_replace));
161+
let on_replace = Replace::register_event_type(self);
162+
assert_eq!(REPLACE, on_replace);
163163

164-
let on_remove = Remove::register_component_id(self);
165-
assert_eq!(REMOVE, EventKey(on_remove));
164+
let on_remove = Remove::register_event_type(self);
165+
assert_eq!(REMOVE, on_remove);
166166

167-
let on_despawn = Despawn::register_component_id(self);
168-
assert_eq!(DESPAWN, EventKey(on_despawn));
167+
let on_despawn = Despawn::register_event_type(self);
168+
assert_eq!(DESPAWN, on_despawn);
169169

170170
// This sets up `Disabled` as a disabling component, via the FromWorld impl
171171
self.init_resource::<DefaultQueryFilters>();

0 commit comments

Comments
 (0)