Skip to content

Commit

Permalink
Fix push_children inserting a Children component even when no chi…
Browse files Browse the repository at this point in the history
…ldren 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
  • Loading branch information
janhohenheim authored Jul 2, 2024
1 parent 5876352 commit 7aaf440
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions crates/bevy_hierarchy/src/child_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.");
Expand Down Expand Up @@ -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());
}
}

0 comments on commit 7aaf440

Please sign in to comment.