From 7aaf440fbfbd1e93c1cfc50130d5f3515e105d5c Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Tue, 2 Jul 2024 15:27:02 +0200 Subject: [PATCH] Fix `push_children` inserting a `Children` component even when no children are supplied (#14109) # Objective The Bevy API around manipulating hierarchies removes `Children` if the operation results in an entity having no children. This means that `Children` is guaranteed to hold actual children. However, the following code unexpectedly inserts empty `Children`: ```rust commands.entity(entity).with_children(|_| {}); ``` This was discovered by @Jondolf: https://discord.com/channels/691052431525675048/1124043933886976171/1257660865625325800 ## Solution - `with_children` is now a noop when no children were passed ## Testing - Added a regression test --- crates/bevy_hierarchy/src/child_builder.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crates/bevy_hierarchy/src/child_builder.rs b/crates/bevy_hierarchy/src/child_builder.rs index a1ed4cf71384c..ba772d328d554 100644 --- a/crates/bevy_hierarchy/src/child_builder.rs +++ b/crates/bevy_hierarchy/src/child_builder.rs @@ -584,6 +584,10 @@ impl BuildChildren for EntityWorldMut<'_> { } fn push_children(&mut self, children: &[Entity]) -> &mut Self { + if children.is_empty() { + return self; + } + let parent = self.id(); if children.contains(&parent) { panic!("Cannot push entity as a child of itself."); @@ -1214,4 +1218,14 @@ mod tests { let children = query.get(&world, parent).unwrap(); assert_eq!(**children, [child]); } + + #[test] + fn push_children_does_not_insert_empty_children() { + let mut world = World::new(); + let parent = world.spawn_empty().push_children(&[]).id(); + + let mut query = world.query::<&Children>(); + let children = query.get(&world, parent); + assert!(children.is_err()); + } }