From cf6100133264ce3c7b407690a13e3dce0d61f61c Mon Sep 17 00:00:00 2001 From: Danila Date: Sun, 8 Jun 2025 21:23:25 +0300 Subject: [PATCH] fix ci tests --- crates/bevy_ecs/src/system/related_system.rs | 42 ++++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/crates/bevy_ecs/src/system/related_system.rs b/crates/bevy_ecs/src/system/related_system.rs index c47a201825..3c1e6e2d4c 100644 --- a/crates/bevy_ecs/src/system/related_system.rs +++ b/crates/bevy_ecs/src/system/related_system.rs @@ -1,4 +1,4 @@ -use std::iter::Map; +use core::iter::Map; use bevy_ecs::{ component::Tick, @@ -21,14 +21,17 @@ pub enum RelatedQueryEntityError { RelationshipTargetEntityError(Entity), } -impl std::error::Error for RelatedQueryEntityError {} +impl core::error::Error for RelatedQueryEntityError {} /// A Query like [system parameter] that provides selective access to the [`Component`] of data stored in a [`World`], /// where source of relationship match filter. /// +/// [system parameter]: crate::system::SystemParam +/// [`Component`]: crate::component::Component +/// /// `Related` is a generic data structure that accepts four type parameters: /// -/// - **`D` (query data)**: +/// - **`D` (query data)**: /// The type of data fetched by the query, which will be returned as the query item. /// Only entities that match the requested data will generate an item. /// Must implement the [`QueryData`] trait. @@ -67,7 +70,7 @@ impl<'w, 's, D: QueryData, F1: QueryFilter, R: RelationshipTarget, F2: QueryFilt >, > { self.data_query - .iter_many(self.filter_query.iter().map(|r| r.get())) + .iter_many(self.filter_query.iter().map(Relationship::get)) } /// Returns an [`Iterator`] over items for mutation. pub fn iter_mut( @@ -83,7 +86,7 @@ impl<'w, 's, D: QueryData, F1: QueryFilter, R: RelationshipTarget, F2: QueryFilt >, > { self.data_query - .iter_many_mut(self.filter_query.iter().map(|r| r.get())) + .iter_many_mut(self.filter_query.iter().map(Relationship::get)) } /// Returns the read-only item for the given [`Entity`]. @@ -93,13 +96,13 @@ impl<'w, 's, D: QueryData, F1: QueryFilter, R: RelationshipTarget, F2: QueryFilt ) -> Result<<::ReadOnly as QueryData>::Item<'w>, RelatedQueryEntityError> { if self.contains(entity) { match self.data_query.get(entity) { - Ok(item) => return Ok(item), - Err(err) => return Err(RelatedQueryEntityError::RelationshipEntityError(err)), + Ok(item) => Ok(item), + Err(err) => Err(RelatedQueryEntityError::RelationshipEntityError(err)), } } else { - return Err(RelatedQueryEntityError::RelationshipTargetEntityError( + Err(RelatedQueryEntityError::RelationshipTargetEntityError( entity, - )); + )) } } @@ -108,7 +111,7 @@ impl<'w, 's, D: QueryData, F1: QueryFilter, R: RelationshipTarget, F2: QueryFilt return self .filter_query .iter() - .map(|r| r.get()) + .map(Relationship::get) .any(|e| e == entity) && self.data_query.contains(entity); } @@ -120,18 +123,19 @@ impl<'w, 's, D: QueryData, F1: QueryFilter, R: RelationshipTarget, F2: QueryFilt ) -> Result<::Item<'w>, RelatedQueryEntityError> { if self.contains(entity) { match self.data_query.get_mut(entity) { - Ok(item) => return Ok(item), - Err(err) => return Err(RelatedQueryEntityError::RelationshipEntityError(err)), + Ok(item) => Ok(item), + Err(err) => Err(RelatedQueryEntityError::RelationshipEntityError(err)), } } else { - return Err(RelatedQueryEntityError::RelationshipTargetEntityError( + Err(RelatedQueryEntityError::RelationshipTargetEntityError( entity, - )); + )) } } } /// Just make 2 independent queries and then combine them. +/// SAFETY: delegates safety to [`Query`] for `ComponentId` and `ArchetypeComponentId` access. unsafe impl<'w, 's, R, D, F1, F2> SystemParam for Related<'w, 's, D, F1, R, F2> where R: RelationshipTarget, @@ -163,6 +167,10 @@ where // world data that the query needs. // The caller ensures the world matches the one used in init_state. let data_query = unsafe { state.0.query_unchecked_manual(world) }; + // SAFETY: We have registered all of the query's world accesses, + // so the caller ensures that `world` has permission to access any + // world data that the query needs. + // The caller ensures the world matches the one used in init_state. let filter_query = unsafe { state.1.query_unchecked_manual(world) }; Related { data_query, @@ -247,7 +255,7 @@ mod tests { fn with_head(q: Query>, q2: Query<&ChildOf, With>) -> usize { q.iter().fold(0, |acc, e| { - if q2.iter().map(|c| c.parent()).find(|c| *c == e).is_some() { + if q2.iter().map(ChildOf::parent).any(|c| c == e) { acc + 1 } else { acc @@ -260,7 +268,7 @@ mod tests { q2: Query<&ChildOf, (With, With)>, ) -> usize { q.iter().fold(0, |acc, e| { - if q2.iter().map(|c| c.parent()).find(|c| *c == e).is_some() { + if q2.iter().map(ChildOf::parent).any(|c| c == e) { acc + 1 } else { acc @@ -279,7 +287,7 @@ mod tests { q2: Query<&ChildOf, (With, Without)>, ) -> usize { q.iter().fold(0, |acc, e| { - if q2.iter().map(|c| c.parent()).find(|c| *c == e).is_some() { + if q2.iter().map(ChildOf::parent).any(|c| c == e) { acc + 1 } else { acc