From 29f7293e3073ce7d9745875dd5db6de43a62cd44 Mon Sep 17 00:00:00 2001 From: Anby Date: Fri, 23 Jun 2023 11:38:13 +0930 Subject: [PATCH] Change `despawn_descendants` to return `&mut Self` (#8928) # Objective - Change despawn descendants to return self (#8883). ## Solution - Change function signature `despawn_descendants` under trait `DespawnRecursiveExt`. - Add single extra test `spawn_children_after_despawn_descendants` (May be unnecessary) --------- Co-authored-by: Alice Cecile --- crates/bevy_hierarchy/src/hierarchy.rs | 36 +++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/crates/bevy_hierarchy/src/hierarchy.rs b/crates/bevy_hierarchy/src/hierarchy.rs index d16ebd1904..32c2f788d6 100644 --- a/crates/bevy_hierarchy/src/hierarchy.rs +++ b/crates/bevy_hierarchy/src/hierarchy.rs @@ -86,7 +86,7 @@ pub trait DespawnRecursiveExt { fn despawn_recursive(self); /// Despawns all descendants of the given entity. - fn despawn_descendants(&mut self); + fn despawn_descendants(&mut self) -> &mut Self; } impl<'w, 's, 'a> DespawnRecursiveExt for EntityCommands<'w, 's, 'a> { @@ -96,9 +96,10 @@ impl<'w, 's, 'a> DespawnRecursiveExt for EntityCommands<'w, 's, 'a> { self.commands().add(DespawnRecursive { entity }); } - fn despawn_descendants(&mut self) { + fn despawn_descendants(&mut self) -> &mut Self { let entity = self.id(); self.commands().add(DespawnChildrenRecursive { entity }); + self } } @@ -117,7 +118,7 @@ impl<'w> DespawnRecursiveExt for EntityMut<'w> { despawn_with_children_recursive(self.into_world_mut(), entity); } - fn despawn_descendants(&mut self) { + fn despawn_descendants(&mut self) -> &mut Self { let entity = self.id(); #[cfg(feature = "trace")] @@ -130,6 +131,7 @@ impl<'w> DespawnRecursiveExt for EntityMut<'w> { self.world_scope(|world| { despawn_children_recursive(world, entity); }); + self } } @@ -246,4 +248,32 @@ mod tests { // The child should be despawned. assert!(world.get_entity(child).is_none()); } + + #[test] + fn spawn_children_after_despawn_descendants() { + let mut world = World::default(); + let mut queue = CommandQueue::default(); + let mut commands = Commands::new(&mut queue, &world); + + let parent = commands.spawn_empty().id(); + let child = commands.spawn_empty().id(); + + commands + .entity(parent) + .add_child(child) + .despawn_descendants() + .with_children(|parent| { + parent.spawn_empty(); + parent.spawn_empty(); + }); + + queue.apply(&mut world); + + // The parent's Children component should still have two children. + let children = world.entity(parent).get::(); + assert!(children.is_some()); + assert!(children.unwrap().len() == 2_usize); + // The original child should be despawned. + assert!(world.get_entity(child).is_none()); + } }