From df51bc592fc406910285b11978da7fac7d7acbb2 Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Wed, 10 Jul 2024 20:25:21 +0200 Subject: [PATCH 1/8] Make single not panic --- .../bevy_ecs/scheduling/run_condition.rs | 2 +- .../bevy_dev_tools/src/ci_testing/systems.rs | 2 +- .../src/ui_debug_overlay/inset.rs | 2 +- .../src/ui_debug_overlay/mod.rs | 2 +- .../tests/ui/query_lifetime_safety.rs | 16 ++-- .../tests/ui/query_to_readonly.rs | 14 +-- .../tests/ui/query_transmute_safety.rs | 8 +- crates/bevy_ecs/src/change_detection.rs | 4 +- crates/bevy_ecs/src/query/error.rs | 2 +- crates/bevy_ecs/src/query/mod.rs | 6 +- crates/bevy_ecs/src/query/state.rs | 57 ++---------- crates/bevy_ecs/src/system/mod.rs | 10 +-- crates/bevy_ecs/src/system/query.rs | 89 +++---------------- crates/bevy_ecs/src/system/system_param.rs | 2 +- crates/bevy_hierarchy/src/query_extension.rs | 4 +- crates/bevy_picking/src/pointer.rs | 2 +- crates/bevy_render/src/lib.rs | 2 +- crates/bevy_scene/src/serde.rs | 11 +-- crates/bevy_text/src/text2d.rs | 4 +- crates/bevy_ui/src/accessibility.rs | 2 +- crates/bevy_ui/src/layout/mod.rs | 8 +- .../src/render/ui_material_pipeline.rs | 2 +- crates/bevy_ui/src/ui_node.rs | 2 +- crates/bevy_ui/src/widget/image.rs | 2 +- crates/bevy_winit/src/accessibility.rs | 2 +- crates/bevy_winit/src/state.rs | 2 +- examples/2d/2d_viewport_to_world.rs | 4 +- examples/2d/bloom_2d.rs | 4 +- examples/2d/bounding_2d.rs | 2 +- examples/2d/pixel_grid_snap.rs | 2 +- examples/2d/rotation.rs | 6 +- examples/2d/sprite_animation.rs | 2 +- examples/2d/wireframe_2d.rs | 2 +- examples/3d/3d_viewport_to_world.rs | 6 +- examples/3d/anti_aliasing.rs | 6 +- examples/3d/atmospheric_fog.rs | 2 +- examples/3d/auto_exposure.rs | 6 +- examples/3d/blend_modes.rs | 4 +- examples/3d/bloom_3d.rs | 4 +- examples/3d/color_grading.rs | 7 +- examples/3d/deferred_rendering.rs | 2 +- examples/3d/fog.rs | 4 +- examples/3d/generate_custom_mesh.rs | 2 +- examples/3d/lighting.rs | 4 +- examples/3d/load_gltf_extras.rs | 2 +- examples/3d/motion_blur.rs | 8 +- examples/3d/parallax_mapping.rs | 8 +- examples/3d/pbr.rs | 4 +- examples/3d/shadow_biases.rs | 21 +++-- examples/3d/spotlight.rs | 2 +- examples/3d/ssao.rs | 6 +- examples/3d/tonemapping.rs | 20 ++--- examples/3d/transmission.rs | 8 +- examples/3d/wireframe.rs | 2 +- examples/app/log_layers_ecs.rs | 2 +- examples/asset/multi_asset_sync.rs | 2 +- examples/audio/audio_control.rs | 6 +- examples/audio/spatial_audio_2d.rs | 2 +- examples/audio/spatial_audio_3d.rs | 2 +- examples/camera/2d_top_down_camera.rs | 6 +- examples/camera/first_person_view_model.rs | 4 +- examples/ecs/iter_combinations.rs | 4 +- examples/ecs/observers.rs | 3 +- examples/ecs/one_shot_systems.rs | 8 +- examples/ecs/parallel_query.rs | 2 +- examples/games/alien_cake_addict.rs | 2 +- examples/games/breakout.rs | 6 +- examples/games/contributors.rs | 4 +- examples/games/desk_toy.rs | 16 ++-- examples/games/game_menu.rs | 2 +- examples/games/loading_screen.rs | 4 +- examples/games/stepping.rs | 2 +- examples/gizmos/light_gizmos.rs | 4 +- examples/helpers/camera_controller.rs | 2 +- examples/input/mouse_grab.rs | 2 +- examples/input/text_input.rs | 27 +++--- examples/math/custom_primitives.rs | 2 +- examples/math/random_sampling.rs | 2 +- examples/math/render_primitives.rs | 4 +- examples/math/sampling_primitives.rs | 4 +- examples/mobile/src/lib.rs | 8 +- examples/movement/smooth_follow.rs | 6 +- .../shader/compute_shader_game_of_life.rs | 2 +- .../shader_material_screenspace_texture.rs | 2 +- examples/shader/shader_prepass.rs | 4 +- examples/state/custom_transitions.rs | 2 +- examples/stress_tests/bevymark.rs | 10 +-- .../stress_tests/many_animated_sprites.rs | 2 +- examples/stress_tests/many_cubes.rs | 2 +- examples/stress_tests/many_gizmos.rs | 2 +- examples/stress_tests/many_lights.rs | 2 +- examples/stress_tests/many_sprites.rs | 2 +- examples/tools/gamepad_viewer.rs | 2 +- .../tools/scene_viewer/morph_viewer_plugin.rs | 2 +- examples/transforms/align.rs | 14 +-- examples/ui/overflow_debug.rs | 2 +- examples/ui/relative_cursor_position.rs | 4 +- examples/ui/size_constraints.rs | 2 +- examples/ui/window_fallthrough.rs | 2 +- examples/window/low_power.rs | 2 +- examples/window/scale_factor_override.rs | 8 +- examples/window/screenshot.rs | 2 +- examples/window/window_resizing.rs | 4 +- examples/window/window_settings.rs | 16 ++-- tests/window/change_window_mode.rs | 2 +- tests/window/minimising.rs | 2 +- tests/window/resizing.rs | 2 +- 107 files changed, 275 insertions(+), 368 deletions(-) diff --git a/benches/benches/bevy_ecs/scheduling/run_condition.rs b/benches/benches/bevy_ecs/scheduling/run_condition.rs index 7f0100633d8f5..9873f405a19b3 100644 --- a/benches/benches/bevy_ecs/scheduling/run_condition.rs +++ b/benches/benches/bevy_ecs/scheduling/run_condition.rs @@ -68,7 +68,7 @@ pub fn run_condition_yes_with_query(criterion: &mut Criterion) { group.measurement_time(std::time::Duration::from_secs(3)); fn empty() {} fn yes_with_query(query: Query<&TestBool>) -> bool { - query.single().0 + query.single().unwrap().0 } for amount in 0..21 { let mut schedule = Schedule::default(); diff --git a/crates/bevy_dev_tools/src/ci_testing/systems.rs b/crates/bevy_dev_tools/src/ci_testing/systems.rs index abb2b28bccfd5..875ff6868e166 100644 --- a/crates/bevy_dev_tools/src/ci_testing/systems.rs +++ b/crates/bevy_dev_tools/src/ci_testing/systems.rs @@ -25,7 +25,7 @@ pub(crate) fn send_events(world: &mut World, mut current_frame: Local) { CiTestingEvent::Screenshot => { let mut primary_window_query = world.query_filtered::>(); - let Ok(main_window) = primary_window_query.get_single(world) else { + let Ok(main_window) = primary_window_query.single()(world) else { warn!("Requesting screenshot, but PrimaryWindow is not available"); continue; }; diff --git a/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs b/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs index 86be2146c73d7..0528284f86043 100644 --- a/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs +++ b/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs @@ -134,7 +134,7 @@ impl<'w, 's> InsetGizmo<'w, 's> { } fn relative(&self, mut position: Vec2) -> Vec2 { let zero = GlobalTransform::IDENTITY; - let Ok(cam) = self.cam.get_single() else { + let Ok(cam) = self.cam.single().unwrap() else { return Vec2::ZERO; }; if let Some(new_position) = cam.world_to_viewport(&zero, position.extend(0.)) { diff --git a/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs b/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs index 6382cfa9038fb..c7887319fe2db 100644 --- a/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs +++ b/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs @@ -199,7 +199,7 @@ fn outline_roots( you might notice gaps between container lines" ); } - let window_scale = window.get_single().map_or(1., Window::scale_factor); + let window_scale = window.single()().map_or(1., Window::scale_factor); let scale_factor = outline.ui_scale.0; // We let the line be defined by the window scale alone diff --git a/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs b/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs index a8db25b2235d3..24cff3185dc9e 100644 --- a/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs +++ b/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs @@ -27,29 +27,29 @@ fn main() { } { - let data: &Foo = query.single(); - let mut data2: Mut = query.single_mut(); + let data: &Foo = query.single().unwrap(); + let mut data2: Mut = query.single_mut().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } { - let mut data2: Mut = query.single_mut(); - let data: &Foo = query.single(); + let mut data2: Mut = query.single_mut().unwrap(); + let data: &Foo = query.single().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } { - let data: &Foo = query.get_single().unwrap(); - let mut data2: Mut = query.get_single_mut().unwrap(); + let data: &Foo = query.single().unwrap().unwrap(); + let mut data2: Mut = query.single_mut().unwrap().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } { - let mut data2: Mut = query.get_single_mut().unwrap(); - let data: &Foo = query.get_single().unwrap(); + let mut data2: Mut = query.single_mut().unwrap().unwrap(); + let data: &Foo = query.single().unwrap().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } diff --git a/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs b/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs index 7e5a23cb2e361..b897ebd712bae 100644 --- a/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs +++ b/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs @@ -35,14 +35,14 @@ fn for_loops(mut query: Query<&mut Foo>) { fn single_mut_query(mut query: Query<&mut Foo>) { // this should fail to compile { - let mut mut_foo = query.single_mut(); + let mut mut_foo = query.single_mut().unwrap(); // This solves "temporary value dropped while borrowed" let readonly_query = query.to_readonly(); //~^ E0502 - let ref_foo = readonly_query.single(); - + let ref_foo = readonly_query.single().unwrap(); + *mut_foo = Foo; println!("{ref_foo:?}"); @@ -53,9 +53,9 @@ fn single_mut_query(mut query: Query<&mut Foo>) { // This solves "temporary value dropped while borrowed" let readonly_query = query.to_readonly(); - let ref_foo = readonly_query.single(); + let ref_foo = readonly_query.single().unwrap(); - let mut mut_foo = query.single_mut(); + let mut mut_foo = query.single_mut().unwrap(); //~^ E0502 println!("{ref_foo:?}"); @@ -68,9 +68,9 @@ fn single_mut_query(mut query: Query<&mut Foo>) { // This solves "temporary value dropped while borrowed" let readonly_query = query.to_readonly(); - let readonly_foo = readonly_query.single(); + let readonly_foo = readonly_query.single().unwrap(); - let query_foo = query.single(); + let query_foo = query.single().unwrap(); println!("{readonly_foo:?}, {query_foo:?}"); } diff --git a/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs b/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs index 489c81d356bec..7518511feee26 100644 --- a/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs +++ b/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs @@ -22,8 +22,8 @@ fn main() { let mut query_a = lens_a.query(); let mut query_b = lens_b.query(); - let a = query_a.single_mut(); - let b = query_b.single_mut(); // oops 2 mutable references to same Foo + let a = query_a.single_mut().unwrap(); + let b = query_b.single_mut().unwrap(); // oops 2 mutable references to same Foo assert_eq!(*a, *b); } @@ -34,8 +34,8 @@ fn main() { let mut query_b = lens.query(); //~^ E0499 - let a = query_a.single_mut(); - let b = query_b.single_mut(); // oops 2 mutable references to same Foo + let a = query_a.single_mut().unwrap(); + let b = query_b.single_mut().unwrap(); // oops 2 mutable references to same Foo assert_eq!(*a, *b); } } diff --git a/crates/bevy_ecs/src/change_detection.rs b/crates/bevy_ecs/src/change_detection.rs index 03e8a40b55a02..65fa7c6e77f43 100644 --- a/crates/bevy_ecs/src/change_detection.rs +++ b/crates/bevy_ecs/src/change_detection.rs @@ -1068,11 +1068,11 @@ mod tests { #[test] fn change_expiration() { fn change_detected(query: Query>) -> bool { - query.single().is_changed() + query.single().unwrap().is_changed() } fn change_expired(query: Query>) -> bool { - query.single().is_changed() + query.single().unwrap().is_changed() } let mut world = World::new(); diff --git a/crates/bevy_ecs/src/query/error.rs b/crates/bevy_ecs/src/query/error.rs index 1f1f33f2c4d56..f71fccb758561 100644 --- a/crates/bevy_ecs/src/query/error.rs +++ b/crates/bevy_ecs/src/query/error.rs @@ -22,7 +22,7 @@ pub enum QueryEntityError { } /// An error that occurs when evaluating a [`Query`](crate::system::Query) or [`QueryState`](crate::query::QueryState) as a single expected result via -/// [`get_single`](crate::system::Query::get_single) or [`get_single_mut`](crate::system::Query::get_single_mut). +/// [`single()`](crate::system::Query::single()) or [`single_mut`](crate::system::Query::single_mut). #[derive(Debug, Error)] pub enum QuerySingleError { /// No entity fits the query. diff --git a/crates/bevy_ecs/src/query/mod.rs b/crates/bevy_ecs/src/query/mod.rs index 4cc2b9f3458a8..e8f92016c4b06 100644 --- a/crates/bevy_ecs/src/query/mod.rs +++ b/crates/bevy_ecs/src/query/mod.rs @@ -758,7 +758,7 @@ mod tests { let _: Option<&Foo> = q.get(&world, e).ok(); let _: Option<&Foo> = q.get_manual(&world, e).ok(); let _: Option<[&Foo; 1]> = q.get_many(&world, [e]).ok(); - let _: Option<&Foo> = q.get_single(&world).ok(); + let _: Option<&Foo> = q.single()(&world).ok(); let _: &Foo = q.single(&world); // system param @@ -771,9 +771,9 @@ mod tests { let _: Option<&Foo> = q.get(e).ok(); let _: Option<[&Foo; 1]> = q.get_many([e]).ok(); - let _: Option<&Foo> = q.get_single().ok(); + let _: Option<&Foo> = q.single().ok(); let _: [&Foo; 1] = q.many([e]); - let _: &Foo = q.single(); + let _: &Foo = q.single().unwrap(); } // regression test for https://github.com/bevyengine/bevy/pull/8029 diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index dcb20250c2466..9a64ac1dc4766 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -1520,37 +1520,15 @@ impl QueryState { /// This can only be called for read-only queries, /// see [`single_mut`](Self::single_mut) for write-queries. /// - /// # Panics - /// - /// Panics if the number of query results is not exactly one. Use - /// [`get_single`](Self::get_single) to return a `Result` instead of panicking. - #[track_caller] - #[inline] - pub fn single<'w>(&mut self, world: &'w World) -> ROQueryItem<'w, D> { - match self.get_single(world) { - Ok(items) => items, - Err(error) => panic!("Cannot get single mutable query result: {error}"), - } - } - - /// Returns a single immutable query result when there is exactly one entity matching - /// the query. - /// - /// This can only be called for read-only queries, - /// see [`get_single_mut`](Self::get_single_mut) for write-queries. - /// /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned /// instead. #[inline] - pub fn get_single<'w>( - &mut self, - world: &'w World, - ) -> Result, QuerySingleError> { + pub fn single<'w>(&mut self, world: &'w World) -> Result, QuerySingleError> { self.update_archetypes(world); // SAFETY: query is read only unsafe { - self.as_readonly().get_single_unchecked_manual( + self.as_readonly().single_unchecked_manual( world.as_unsafe_world_cell_readonly(), world.last_change_tick(), world.read_change_tick(), @@ -1558,30 +1536,13 @@ impl QueryState { } } - /// Returns a single mutable query result when there is exactly one entity matching - /// the query. - /// - /// # Panics - /// - /// Panics if the number of query results is not exactly one. Use - /// [`get_single_mut`](Self::get_single_mut) to return a `Result` instead of panicking. - #[track_caller] - #[inline] - pub fn single_mut<'w>(&mut self, world: &'w mut World) -> D::Item<'w> { - // SAFETY: query has unique world access - match self.get_single_mut(world) { - Ok(items) => items, - Err(error) => panic!("Cannot get single query result: {error}"), - } - } - /// Returns a single mutable query result when there is exactly one entity matching /// the query. /// /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned /// instead. #[inline] - pub fn get_single_mut<'w>( + pub fn single_mut<'w>( &mut self, world: &'w mut World, ) -> Result, QuerySingleError> { @@ -1591,7 +1552,7 @@ impl QueryState { let last_change_tick = world.last_change_tick(); // SAFETY: query has unique world access unsafe { - self.get_single_unchecked_manual( + self.single_unchecked_manual( world.as_unsafe_world_cell(), last_change_tick, change_tick, @@ -1609,12 +1570,12 @@ impl QueryState { /// This does not check for mutable query correctness. To be safe, make sure mutable queries /// have unique access to the components they query. #[inline] - pub unsafe fn get_single_unchecked<'w>( + pub unsafe fn single_unchecked<'w>( &mut self, world: UnsafeWorldCell<'w>, ) -> Result, QuerySingleError> { self.update_archetypes_unsafe_world_cell(world); - self.get_single_unchecked_manual(world, world.last_change_tick(), world.change_tick()) + self.single_unchecked_manual(world, world.last_change_tick(), world.change_tick()) } /// Returns a query result when there is exactly one entity matching the query, @@ -1628,7 +1589,7 @@ impl QueryState { /// This does not check for mutable query correctness. To be safe, make sure mutable queries /// have unique access to the components they query. #[inline] - pub unsafe fn get_single_unchecked_manual<'w>( + pub unsafe fn single_unchecked_manual<'w>( &self, world: UnsafeWorldCell<'w>, last_run: Tick, @@ -1938,7 +1899,7 @@ mod tests { world.clear_trackers(); - assert!(query.get_single(&world).is_err()); + assert!(query.single()(&world).is_err()); } #[test] @@ -1954,7 +1915,7 @@ mod tests { world.clear_trackers(); - assert!(detection_query.get_single(&world).is_err()); + assert!(detection_query.single()(&world).is_err()); change_query.single_mut(&mut world).0 = 1; diff --git a/crates/bevy_ecs/src/system/mod.rs b/crates/bevy_ecs/src/system/mod.rs index d2cf03a96eda0..ee4b3b1faa456 100644 --- a/crates/bevy_ecs/src/system/mod.rs +++ b/crates/bevy_ecs/src/system/mod.rs @@ -1185,7 +1185,7 @@ mod tests { let (a, query, _) = system_state.get(&world); assert_eq!(*a, A(42), "returned resource matches initial value"); assert_eq!( - *query.single(), + *query.single().unwrap(), B(7), "returned component matches initial value" ); @@ -1212,7 +1212,7 @@ mod tests { let (a, mut query) = system_state.get_mut(&mut world); assert_eq!(*a, A(42), "returned resource matches initial value"); assert_eq!( - *query.single_mut(), + *query.single_mut().unwrap(), B(7), "returned component matches initial value" ); @@ -1229,18 +1229,18 @@ mod tests { let mut system_state: SystemState>> = SystemState::new(&mut world); { let query = system_state.get(&world); - assert_eq!(*query.single(), A(1)); + assert_eq!(*query.single().unwrap(), A(1)); } { let query = system_state.get(&world); - assert!(query.get_single().is_err()); + assert!(query.single().unwrap().is_err()); } world.entity_mut(entity).get_mut::().unwrap().0 = 2; { let query = system_state.get(&world); - assert_eq!(*query.single(), A(2)); + assert_eq!(*query.single().unwrap(), A(2)); } } diff --git a/crates/bevy_ecs/src/system/query.rs b/crates/bevy_ecs/src/system/query.rs index 215c8d7b1108b..b5bfccab06431 100644 --- a/crates/bevy_ecs/src/system/query.rs +++ b/crates/bevy_ecs/src/system/query.rs @@ -244,7 +244,7 @@ use std::borrow::Borrow; /// |[`iter_combinations`]\[[`_mut`][`iter_combinations_mut`]]|Returns an iterator over all combinations of a specified number of query items.| /// |[`get`]\[[`_mut`][`get_mut`]]|Returns the query item for the specified entity.| /// |[`many`]\[[`_mut`][`many_mut`]],
[`get_many`]\[[`_mut`][`get_many_mut`]]|Returns the query items for the specified entities.| -/// |[`single`]\[[`_mut`][`single_mut`]],
[`get_single`]\[[`_mut`][`get_single_mut`]]|Returns the query item while verifying that there aren't others.| +/// |[`single`]\[[`_mut`][`single_mut`]],
[`single()`]\[[`_mut`][`single_mut`]]|Returns the query item while verifying that there aren't others.| /// /// There are two methods for each type of query operation: immutable and mutable (ending with `_mut`). /// When using immutable methods, the query items returned are of type [`ROQueryItem`], a read-only version of the query item. @@ -281,7 +281,7 @@ use std::borrow::Borrow; /// |[`get`]\[[`_mut`][`get_mut`]]|O(1)| /// |([`get_`][`get_many`])[`many`]|O(k)| /// |([`get_`][`get_many_mut`])[`many_mut`]|O(k2)| -/// |[`single`]\[[`_mut`][`single_mut`]],
[`get_single`]\[[`_mut`][`get_single_mut`]]|O(a)| +/// |[`single`]\[[`_mut`][`single_mut`]],
[`single()`]\[[`_mut`][`single_mut`]]|O(a)| /// |Archetype based filtering ([`With`], [`Without`], [`Or`])|O(a)| /// |Change detection filtering ([`Added`], [`Changed`])|O(a + n)| /// @@ -325,8 +325,8 @@ use std::borrow::Borrow; /// [`get_many`]: Self::get_many /// [`get_many_mut`]: Self::get_many_mut /// [`get_mut`]: Self::get_mut -/// [`get_single`]: Self::get_single -/// [`get_single_mut`]: Self::get_single_mut +/// [`single()`]: Self::single() +/// [`single_mut`]: Self::single_mut /// [`iter`]: Self::iter /// [`iter_combinations`]: Self::iter_combinations /// [`iter_combinations_mut`]: Self::iter_combinations_mut @@ -1071,36 +1071,6 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { } } - /// Returns a single read-only query item when there is exactly one entity matching the query. - /// - /// # Panics - /// - /// This method panics if the number of query items is **not** exactly one. - /// - /// # Example - /// - /// ``` - /// # use bevy_ecs::prelude::*; - /// # #[derive(Component)] - /// # struct Player; - /// # #[derive(Component)] - /// # struct Position(f32, f32); - /// fn player_system(query: Query<&Position, With>) { - /// let player_position = query.single(); - /// // do something with player_position - /// } - /// # bevy_ecs::system::assert_is_system(player_system); - /// ``` - /// - /// # See also - /// - /// - [`get_single`](Self::get_single) for the non-panicking version. - /// - [`single_mut`](Self::single_mut) to get the mutable query item. - #[track_caller] - pub fn single(&self) -> ROQueryItem<'_, D> { - self.get_single().unwrap() - } - /// Returns a single read-only query item when there is exactly one entity matching the query. /// /// If the number of query items is not exactly one, a [`QuerySingleError`] is returned instead. @@ -1113,7 +1083,7 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// # #[derive(Component)] /// # struct PlayerScore(i32); /// fn player_scoring_system(query: Query<&PlayerScore>) { - /// match query.get_single() { + /// match query.single().unwrap() { /// Ok(PlayerScore(score)) => { /// println!("Score: {}", score); /// } @@ -1130,15 +1100,14 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// /// # See also /// - /// - [`get_single_mut`](Self::get_single_mut) to get the mutable query item. - /// - [`single`](Self::single) for the panicking version. + /// - [`single_mut`](Self::single_mut) to get the mutable query item. #[inline] - pub fn get_single(&self) -> Result, QuerySingleError> { + pub fn single(&self) -> Result, QuerySingleError> { // SAFETY: // the query ensures that the components it accesses are not mutably accessible somewhere else // and the query is read only. unsafe { - self.state.as_readonly().get_single_unchecked_manual( + self.state.as_readonly().single_unchecked_manual( self.world, self.last_run, self.this_run, @@ -1146,38 +1115,6 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { } } - /// Returns a single query item when there is exactly one entity matching the query. - /// - /// # Panics - /// - /// This method panics if the number of query items is **not** exactly one. - /// - /// # Example - /// - /// ``` - /// # use bevy_ecs::prelude::*; - /// # - /// # #[derive(Component)] - /// # struct Player; - /// # #[derive(Component)] - /// # struct Health(u32); - /// # - /// fn regenerate_player_health_system(mut query: Query<&mut Health, With>) { - /// let mut health = query.single_mut(); - /// health.0 += 1; - /// } - /// # bevy_ecs::system::assert_is_system(regenerate_player_health_system); - /// ``` - /// - /// # See also - /// - /// - [`get_single_mut`](Self::get_single_mut) for the non-panicking version. - /// - [`single`](Self::single) to get the read-only query item. - #[track_caller] - pub fn single_mut(&mut self) -> D::Item<'_> { - self.get_single_mut().unwrap() - } - /// Returns a single query item when there is exactly one entity matching the query. /// /// If the number of query items is not exactly one, a [`QuerySingleError`] is returned instead. @@ -1193,7 +1130,7 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// # struct Health(u32); /// # /// fn regenerate_player_health_system(mut query: Query<&mut Health, With>) { - /// let mut health = query.get_single_mut().expect("Error: Could not find a single player."); + /// let mut health = query.single_mut().unwrap().expect("Error: Could not find a single player."); /// health.0 += 1; /// } /// # bevy_ecs::system::assert_is_system(regenerate_player_health_system); @@ -1201,16 +1138,16 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// /// # See also /// - /// - [`get_single`](Self::get_single) to get the read-only query item. + /// - [`single`](Self::single) to get the read-only query item. /// - [`single_mut`](Self::single_mut) for the panicking version. #[inline] - pub fn get_single_mut(&mut self) -> Result, QuerySingleError> { + pub fn single_mut(&mut self) -> Result, QuerySingleError> { // SAFETY: // the query ensures mutable access to the components it accesses, and the query // is uniquely borrowed unsafe { self.state - .get_single_unchecked_manual(self.world, self.last_run, self.this_run) + .single_unchecked_manual(self.world, self.last_run, self.this_run) } } @@ -1318,7 +1255,7 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// # world.spawn((A(10), B(5))); /// # /// fn reusable_function(lens: &mut QueryLens<&A>) { - /// assert_eq!(lens.query().single().0, 10); + /// assert_eq!(lens.query().single().unwrap().0, 10); /// } /// /// // We can use the function in a system that takes the exact query. diff --git a/crates/bevy_ecs/src/system/system_param.rs b/crates/bevy_ecs/src/system/system_param.rs index 415b62e0ad820..db1cece665954 100644 --- a/crates/bevy_ecs/src/system/system_param.rs +++ b/crates/bevy_ecs/src/system/system_param.rs @@ -945,7 +945,7 @@ pub trait SystemBuffer: FromWorld + Send + 'static { /// criminals: Query<&Criminal>, /// mut alarm: Deferred /// ) { -/// let settlement = settlements.single(); +/// let settlement = settlements.single().unwrap(); /// for criminal in &criminals { /// // Only sound the alarm if the criminal is a threat. /// // For this example, assume that this check is expensive to run. diff --git a/crates/bevy_hierarchy/src/query_extension.rs b/crates/bevy_hierarchy/src/query_extension.rs index 4525a3ea5dcf5..7fdaf06060832 100644 --- a/crates/bevy_hierarchy/src/query_extension.rs +++ b/crates/bevy_hierarchy/src/query_extension.rs @@ -23,7 +23,7 @@ pub trait HierarchyQueryExt<'w, 's, D: QueryData, F: QueryFilter> { /// # #[derive(Component)] /// # struct Marker; /// fn system(query: Query>, children_query: Query<&Children>) { - /// let entity = query.single(); + /// let entity = query.single().unwrap(); /// for descendant in children_query.iter_descendants(entity) { /// // Do something! /// } @@ -45,7 +45,7 @@ pub trait HierarchyQueryExt<'w, 's, D: QueryData, F: QueryFilter> { /// # #[derive(Component)] /// # struct Marker; /// fn system(query: Query>, parent_query: Query<&Parent>) { - /// let entity = query.single(); + /// let entity = query.single().unwrap(); /// for ancestor in parent_query.iter_ancestors(entity) { /// // Do something! /// } diff --git a/crates/bevy_picking/src/pointer.rs b/crates/bevy_picking/src/pointer.rs index 3d1991c1ec246..2a6754421d749 100644 --- a/crates/bevy_picking/src/pointer.rs +++ b/crates/bevy_picking/src/pointer.rs @@ -289,7 +289,7 @@ impl Location { ) -> bool { if camera .target - .normalize(Some(match primary_window.get_single() { + .normalize(Some(match primary_window.single() { Ok(w) => w, Err(_) => return false, })) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 49f25530b1323..e530004f9781c 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -270,7 +270,7 @@ impl Plugin for RenderPlugin { let mut system_state: SystemState< Query<&RawHandleWrapperHolder, With>, > = SystemState::new(app.world_mut()); - let primary_window = system_state.get(app.world()).get_single().ok().cloned(); + let primary_window = system_state.get(app.world()).single().ok().cloned(); let settings = render_creation.clone(); let async_renderer = async move { let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { diff --git a/crates/bevy_scene/src/serde.rs b/crates/bevy_scene/src/serde.rs index b5ac7478c99c4..aa7d59f2f4378 100644 --- a/crates/bevy_scene/src/serde.rs +++ b/crates/bevy_scene/src/serde.rs @@ -714,13 +714,10 @@ mod tests { let bar_to_foo = dst_world .query_filtered::<&MyEntityRef, Without>() - .get_single(&dst_world) - .cloned() - .unwrap(); - let foo = dst_world - .query_filtered::>() - .get_single(&dst_world) - .unwrap(); + .single()(&dst_world) + .cloned() + .unwrap(); + let foo = dst_world.query_filtered::>().single()(&dst_world).unwrap(); assert_eq!(foo, bar_to_foo.0); assert!(dst_world diff --git a/crates/bevy_text/src/text2d.rs b/crates/bevy_text/src/text2d.rs index 8c28fe3079aca..4d7284812193d 100644 --- a/crates/bevy_text/src/text2d.rs +++ b/crates/bevy_text/src/text2d.rs @@ -82,7 +82,7 @@ pub fn extract_text2d_sprite( ) { // TODO: Support window-independent scaling: https://github.com/bevyengine/bevy/issues/5621 let scale_factor = windows - .get_single() + .single() .map(|window| window.resolution.scale_factor()) .unwrap_or(1.0); let scaling = GlobalTransform::from_scale(Vec2::splat(scale_factor.recip()).extend(1.)); @@ -164,7 +164,7 @@ pub fn update_text2d_layout( // TODO: Support window-independent scaling: https://github.com/bevyengine/bevy/issues/5621 let scale_factor = windows - .get_single() + .single() .map(|window| window.resolution.scale_factor()) .unwrap_or(1.0); diff --git a/crates/bevy_ui/src/accessibility.rs b/crates/bevy_ui/src/accessibility.rs index cbcf8e82d36ca..06dbe453a5192 100644 --- a/crates/bevy_ui/src/accessibility.rs +++ b/crates/bevy_ui/src/accessibility.rs @@ -38,7 +38,7 @@ fn calc_bounds( camera: Query<(&Camera, &GlobalTransform)>, mut nodes: Query<(&mut AccessibilityNode, Ref, Ref)>, ) { - if let Ok((camera, camera_transform)) = camera.get_single() { + if let Ok((camera, camera_transform)) = camera.single() { for (mut accessible, node, transform) in &mut nodes { if node.is_changed() || transform.is_changed() { if let Some(translation) = diff --git a/crates/bevy_ui/src/layout/mod.rs b/crates/bevy_ui/src/layout/mod.rs index 886cef8b9cb4a..ba1c6f955f99f 100644 --- a/crates/bevy_ui/src/layout/mod.rs +++ b/crates/bevy_ui/src/layout/mod.rs @@ -115,7 +115,7 @@ pub fn ui_layout_system( let scale_factor = camera.target_scaling_factor().unwrap_or(1.0); let camera_target = camera .target - .normalize(primary_window.get_single().map(|(e, _)| e).ok()); + .normalize(primary_window.single().map(|(e, _)| e).ok()); let resized = matches!(camera_target, Some(NormalizedRenderTarget::Window(window_ref)) if resized_windows.contains(&window_ref.entity()) ); @@ -302,7 +302,7 @@ pub fn resolve_outlines_system( mut outlines_query: Query<(&Outline, &mut Node)>, ) { let viewport_size = primary_window - .get_single() + .single() .map(Window::size) .unwrap_or(Vec2::ZERO) / ui_scale.0; @@ -772,7 +772,7 @@ mod tests { mut cameras: Query<&mut Camera>, ) { let primary_window = primary_window_query - .get_single() + .single() .expect("missing primary window"); let camera_count = cameras.iter().len(); for (camera_index, mut camera) in cameras.iter_mut().enumerate() { @@ -829,7 +829,7 @@ mod tests { ui_schedule.run(world); let (ui_node_entity, TargetCamera(target_camera_entity)) = world .query_filtered::<(Entity, &TargetCamera), With>() - .get_single(world) + .single(world) .expect("missing MovingUiNode"); assert_eq!(expected_camera_entity, target_camera_entity); let ui_surface = world.resource::(); diff --git a/crates/bevy_ui/src/render/ui_material_pipeline.rs b/crates/bevy_ui/src/render/ui_material_pipeline.rs index 49eee2ed25579..b6739c9a13b2c 100644 --- a/crates/bevy_ui/src/render/ui_material_pipeline.rs +++ b/crates/bevy_ui/src/render/ui_material_pipeline.rs @@ -376,7 +376,7 @@ pub fn extract_ui_material_nodes( ui_scale: Extract>, ) { let ui_logical_viewport_size = windows - .get_single() + .single() .map(Window::size) .unwrap_or(Vec2::ZERO) // The logical window resolution returned by `Window` only takes into account the window scale factor and not `UiScale`, diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index 5e918e4d1ca8e..f12800c153f11 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -2304,7 +2304,7 @@ pub struct DefaultUiCamera<'w, 's> { impl<'w, 's> DefaultUiCamera<'w, 's> { pub fn get(&self) -> Option { - self.default_cameras.get_single().ok().or_else(|| { + self.default_cameras.single().ok().or_else(|| { // If there isn't a single camera and the query isn't empty, there is two or more cameras queried. if !self.default_cameras.is_empty() { warn_once!("Two or more Entities with IsDefaultUiCamera found when only one Camera with this marker is allowed."); diff --git a/crates/bevy_ui/src/widget/image.rs b/crates/bevy_ui/src/widget/image.rs index cf04384404bda..be4e38f478ab2 100644 --- a/crates/bevy_ui/src/widget/image.rs +++ b/crates/bevy_ui/src/widget/image.rs @@ -111,7 +111,7 @@ pub fn update_image_content_size_system( >, ) { let combined_scale_factor = windows - .get_single() + .single() .map(|window| window.resolution.scale_factor()) .unwrap_or(1.) * ui_scale.0; diff --git a/crates/bevy_winit/src/accessibility.rs b/crates/bevy_winit/src/accessibility.rs index e72c6c8cfe79c..3467361e09c48 100644 --- a/crates/bevy_winit/src/accessibility.rs +++ b/crates/bevy_winit/src/accessibility.rs @@ -189,7 +189,7 @@ fn update_accessibility_nodes( )>, node_entities: Query>, ) { - let Ok((primary_window_id, primary_window)) = primary_window.get_single() else { + let Ok((primary_window_id, primary_window)) = primary_window.single() else { return; }; let Some(adapter) = adapters.get_mut(&primary_window_id) else { diff --git a/crates/bevy_winit/src/state.rs b/crates/bevy_winit/src/state.rs index 8b866d59799c1..5da63bb5ef962 100644 --- a/crates/bevy_winit/src/state.rs +++ b/crates/bevy_winit/src/state.rs @@ -463,7 +463,7 @@ impl ApplicationHandler for WinitAppRunnerState { // handle wrapper removed when the app was suspended. let mut query = self.world_mut() .query_filtered::<(Entity, &Window), (With, Without)>(); - if let Ok((entity, window)) = query.get_single(&self.world()) { + if let Ok((entity, window)) = query.single()(&self.world()) { let window = window.clone(); let mut create_window = diff --git a/examples/2d/2d_viewport_to_world.rs b/examples/2d/2d_viewport_to_world.rs index 788649f9793c0..98e1f31847434 100644 --- a/examples/2d/2d_viewport_to_world.rs +++ b/examples/2d/2d_viewport_to_world.rs @@ -15,9 +15,9 @@ fn draw_cursor( windows: Query<&Window>, mut gizmos: Gizmos, ) { - let (camera, camera_transform) = camera_query.single(); + let (camera, camera_transform) = camera_query.single().unwrap(); - let Some(cursor_position) = windows.single().cursor_position() else { + let Some(cursor_position) = windows.single().unwrap().cursor_position() else { return; }; diff --git a/examples/2d/bloom_2d.rs b/examples/2d/bloom_2d.rs index 3735fcf3000e4..e6f9c1a2e6a62 100644 --- a/examples/2d/bloom_2d.rs +++ b/examples/2d/bloom_2d.rs @@ -84,8 +84,8 @@ fn update_bloom_settings( keycode: Res>, time: Res
().unwrap().0); @@ -1890,16 +1890,16 @@ mod tests { let mut query = QueryState::<(Entity, &A, Has)>::new(&mut world) .transmute_filtered::<(Entity, Has), Added>(world.components()); - assert_eq!((entity_a, false), query.single(&world)); + assert_eq!((entity_a, false), query.single(&world).unwrap()); world.clear_trackers(); let entity_b = world.spawn((A(0), B(0))).id(); - assert_eq!((entity_b, true), query.single(&world)); + assert_eq!((entity_b, true), query.single(&world).unwrap()); world.clear_trackers(); - assert!(query.single()(&world).is_err()); + assert!(query.single(&world).is_err()); } #[test] @@ -1911,15 +1911,15 @@ mod tests { .transmute_filtered::>(world.components()); let mut change_query = QueryState::<&mut A>::new(&mut world); - assert_eq!(entity_a, detection_query.single(&world)); + assert_eq!(entity_a, detection_query.single(&world).unwrap()); world.clear_trackers(); - assert!(detection_query.single()(&world).is_err()); + assert!(detection_query.single(&world).is_err()); - change_query.single_mut(&mut world).0 = 1; + change_query.single_mut(&mut world).unwrap().0 = 1; - assert_eq!(entity_a, detection_query.single(&world)); + assert_eq!(entity_a, detection_query.single(&world).unwrap()); } #[test] diff --git a/examples/games/desk_toy.rs b/examples/games/desk_toy.rs index 0a66499bfb14d..9b8da8d8131f6 100644 --- a/examples/games/desk_toy.rs +++ b/examples/games/desk_toy.rs @@ -343,7 +343,7 @@ fn toggle_transparency( mut commands: Commands, mut window_transparency: ResMut, mut q_instructions_text: Query<&mut Visibility, With>, - mut q_primary_window: Query<&mut Window, With>, + mut q_primary_window: Query<&Window, With>, ) { // Toggle the window transparency resource window_transparency.0 = !window_transparency.0; @@ -359,7 +359,7 @@ fn toggle_transparency( // Remove the primary window's decorations (e.g. borders), make it always on top of other desktop windows, and set the clear color to transparent // only if window transparency is enabled - let mut window = q_primary_window.single_mut().unwrap(); + let window = q_primary_window.single().unwrap(); let clear_color; (window.decorations, window.window_level, clear_color) = if window_transparency.0 { (false, WindowLevel::AlwaysOnTop, Color::NONE) diff --git a/examples/mobile/src/lib.rs b/examples/mobile/src/lib.rs index d497419391f38..78216f233f1ba 100644 --- a/examples/mobile/src/lib.rs +++ b/examples/mobile/src/lib.rs @@ -175,7 +175,7 @@ fn handle_lifetime( mut lifecycle_events: EventReader, music_controller: Query<&AudioSink>, ) { - let Ok(music_controller) = music_controller.single().unwrap() else { + let Ok(music_controller) = music_controller.single() else { return; }; From b10f946263f3e64c8217a908533a0a0740665b40 Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Wed, 10 Jul 2024 20:48:35 +0200 Subject: [PATCH 3/8] Fix mutability --- examples/games/desk_toy.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/games/desk_toy.rs b/examples/games/desk_toy.rs index 9b8da8d8131f6..9fc6c01392899 100644 --- a/examples/games/desk_toy.rs +++ b/examples/games/desk_toy.rs @@ -343,7 +343,7 @@ fn toggle_transparency( mut commands: Commands, mut window_transparency: ResMut, mut q_instructions_text: Query<&mut Visibility, With>, - mut q_primary_window: Query<&Window, With>, + q_primary_window: Query<&Window, With>, ) { // Toggle the window transparency resource window_transparency.0 = !window_transparency.0; From b434d60ab9de78ee88f43bedd64fbfbacecec985 Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Wed, 10 Jul 2024 20:57:55 +0200 Subject: [PATCH 4/8] Fix whoops --- crates/bevy_dev_tools/src/ci_testing/systems.rs | 2 +- examples/games/desk_toy.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_dev_tools/src/ci_testing/systems.rs b/crates/bevy_dev_tools/src/ci_testing/systems.rs index 875ff6868e166..63ccd86af81b1 100644 --- a/crates/bevy_dev_tools/src/ci_testing/systems.rs +++ b/crates/bevy_dev_tools/src/ci_testing/systems.rs @@ -25,7 +25,7 @@ pub(crate) fn send_events(world: &mut World, mut current_frame: Local) { CiTestingEvent::Screenshot => { let mut primary_window_query = world.query_filtered::>(); - let Ok(main_window) = primary_window_query.single()(world) else { + let Ok(main_window) = primary_window_query.single(world) else { warn!("Requesting screenshot, but PrimaryWindow is not available"); continue; }; diff --git a/examples/games/desk_toy.rs b/examples/games/desk_toy.rs index 9fc6c01392899..0a66499bfb14d 100644 --- a/examples/games/desk_toy.rs +++ b/examples/games/desk_toy.rs @@ -343,7 +343,7 @@ fn toggle_transparency( mut commands: Commands, mut window_transparency: ResMut, mut q_instructions_text: Query<&mut Visibility, With>, - q_primary_window: Query<&Window, With>, + mut q_primary_window: Query<&mut Window, With>, ) { // Toggle the window transparency resource window_transparency.0 = !window_transparency.0; @@ -359,7 +359,7 @@ fn toggle_transparency( // Remove the primary window's decorations (e.g. borders), make it always on top of other desktop windows, and set the clear color to transparent // only if window transparency is enabled - let window = q_primary_window.single().unwrap(); + let mut window = q_primary_window.single_mut().unwrap(); let clear_color; (window.decorations, window.window_level, clear_color) = if window_transparency.0 { (false, WindowLevel::AlwaysOnTop, Color::NONE) From e67d4c8534b1f41bae646c9222ca5e7842c943a1 Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Wed, 10 Jul 2024 21:12:01 +0200 Subject: [PATCH 5/8] Fix whoops --- crates/bevy_ecs/src/change_detection.rs | 2 +- crates/bevy_ecs/src/query/builder.rs | 12 ++++++------ crates/bevy_ecs/src/query/state.rs | 4 ++-- crates/bevy_ecs/src/system/mod.rs | 2 +- crates/bevy_scene/src/bundle.rs | 3 ++- crates/bevy_scene/src/scene_spawner.rs | 5 ++++- crates/bevy_scene/src/serde.rs | 11 +++++++---- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/crates/bevy_ecs/src/change_detection.rs b/crates/bevy_ecs/src/change_detection.rs index 65fa7c6e77f43..fb2ed1cd8b5e0 100644 --- a/crates/bevy_ecs/src/change_detection.rs +++ b/crates/bevy_ecs/src/change_detection.rs @@ -1114,7 +1114,7 @@ mod tests { // Since the world is always ahead, as long as changes can't get older than `u32::MAX` (which we ensure), // the wrapping difference will always be positive, so wraparound doesn't matter. let mut query = world.query::>(); - assert!(query.single(&world).is_changed()); + assert!(query.single(&world).unwrap().is_changed()); } #[test] diff --git a/crates/bevy_ecs/src/query/builder.rs b/crates/bevy_ecs/src/query/builder.rs index 101371d00400f..447ec1a500c35 100644 --- a/crates/bevy_ecs/src/query/builder.rs +++ b/crates/bevy_ecs/src/query/builder.rs @@ -272,13 +272,13 @@ mod tests { .with::() .without::() .build(); - assert_eq!(entity_a, query_a.single(&world)); + assert_eq!(entity_a, query_a.single(&world).unwrap()); let mut query_b = QueryBuilder::::new(&mut world) .with::() .without::() .build(); - assert_eq!(entity_b, query_b.single(&world)); + assert_eq!(entity_b, query_b.single(&world).unwrap()); } #[test] @@ -294,13 +294,13 @@ mod tests { .with_id(component_id_a) .without_id(component_id_c) .build(); - assert_eq!(entity_a, query_a.single(&world)); + assert_eq!(entity_a, query_a.single(&world).unwrap()); let mut query_b = QueryBuilder::::new(&mut world) .with_id(component_id_a) .without_id(component_id_b) .build(); - assert_eq!(entity_b, query_b.single(&world)); + assert_eq!(entity_b, query_b.single(&world).unwrap()); } #[test] @@ -360,7 +360,7 @@ mod tests { .data::<&B>() .build(); - let entity_ref = query.single(&world); + let entity_ref = query.single(&world).unwrap(); assert_eq!(entity, entity_ref.id()); @@ -383,7 +383,7 @@ mod tests { .ref_id(component_id_b) .build(); - let entity_ref = query.single(&world); + let entity_ref = query.single(&world).unwrap(); assert_eq!(entity, entity_ref.id()); diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index 134f7954487cd..a273e3114c241 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -1769,7 +1769,7 @@ mod tests { let q = world.query::<()>(); let mut q = q.transmute::(world.components()); - assert_eq!(q.single(&world), entity); + assert_eq!(q.single(&world).unwrap(), entity); } #[test] @@ -1947,7 +1947,7 @@ mod tests { let mut new_query: QueryState = query_1.join_filtered(world.components(), &query_2); - assert_eq!(new_query.single(&world), entity_ab); + assert_eq!(new_query.single(&world).unwrap(), entity_ab); } #[test] diff --git a/crates/bevy_ecs/src/system/mod.rs b/crates/bevy_ecs/src/system/mod.rs index ee4b3b1faa456..bdb7c2b55c870 100644 --- a/crates/bevy_ecs/src/system/mod.rs +++ b/crates/bevy_ecs/src/system/mod.rs @@ -1234,7 +1234,7 @@ mod tests { { let query = system_state.get(&world); - assert!(query.single().unwrap().is_err()); + assert!(query.single().is_err()); } world.entity_mut(entity).get_mut::().unwrap().0 = 2; diff --git a/crates/bevy_scene/src/bundle.rs b/crates/bevy_scene/src/bundle.rs index a154acdccdaa5..dc7cbced91fd8 100644 --- a/crates/bevy_scene/src/bundle.rs +++ b/crates/bevy_scene/src/bundle.rs @@ -157,7 +157,8 @@ mod tests { let (scene_entity, scene_component_a) = app .world_mut() .query::<(Entity, &ComponentA)>() - .single(app.world()); + .single(app.world()) + .unwrap(); assert_eq!(scene_component_a.x, 3.0); assert_eq!(scene_component_a.y, 4.0); assert_eq!( diff --git a/crates/bevy_scene/src/scene_spawner.rs b/crates/bevy_scene/src/scene_spawner.rs index 45791eb1d61a7..3d5d737c328c7 100644 --- a/crates/bevy_scene/src/scene_spawner.rs +++ b/crates/bevy_scene/src/scene_spawner.rs @@ -500,7 +500,10 @@ mod tests { // clone only existing entity let mut scene_spawner = SceneSpawner::default(); - let entity = world.query_filtered::>().single(&world); + let entity = world + .query_filtered::>() + .single(&world) + .unwrap(); let scene = DynamicSceneBuilder::from_world(&world) .extract_entity(entity) .build(); diff --git a/crates/bevy_scene/src/serde.rs b/crates/bevy_scene/src/serde.rs index aa7d59f2f4378..d236e8591d195 100644 --- a/crates/bevy_scene/src/serde.rs +++ b/crates/bevy_scene/src/serde.rs @@ -714,10 +714,13 @@ mod tests { let bar_to_foo = dst_world .query_filtered::<&MyEntityRef, Without>() - .single()(&dst_world) - .cloned() - .unwrap(); - let foo = dst_world.query_filtered::>().single()(&dst_world).unwrap(); + .single(&dst_world) + .cloned() + .unwrap(); + let foo = dst_world + .query_filtered::>() + .single(&dst_world) + .unwrap(); assert_eq!(foo, bar_to_foo.0); assert!(dst_world From 855244fec7b24f532717cda7edf8d3cdfc51b874 Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Wed, 10 Jul 2024 21:36:05 +0200 Subject: [PATCH 6/8] Fix whoops --- .../compile_fail/tests/ui/query_lifetime_safety.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs b/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs index 24cff3185dc9e..62d76bec1695b 100644 --- a/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs +++ b/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs @@ -41,15 +41,15 @@ fn main() { } { - let data: &Foo = query.single().unwrap().unwrap(); - let mut data2: Mut = query.single_mut().unwrap().unwrap(); + let data: &Foo = query.single().unwrap(); + let mut data2: Mut = query.single_mut().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } { - let mut data2: Mut = query.single_mut().unwrap().unwrap(); - let data: &Foo = query.single().unwrap().unwrap(); + let mut data2: Mut = query.single_mut().unwrap(); + let data: &Foo = query.single().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } From c25a9ea3910b34840827ac2ac36e641b9d46cbfb Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Wed, 10 Jul 2024 21:39:08 +0200 Subject: [PATCH 7/8] Rename single to get_single --- .../bevy_ecs/scheduling/run_condition.rs | 2 +- .../src/ui_debug_overlay/inset.rs | 2 +- .../src/ui_debug_overlay/mod.rs | 2 +- .../tests/ui/query_lifetime_safety.rs | 16 +++++++------- .../tests/ui/query_to_readonly.rs | 12 +++++----- .../tests/ui/query_transmute_safety.rs | 8 +++---- crates/bevy_ecs/src/change_detection.rs | 4 ++-- crates/bevy_ecs/src/query/error.rs | 2 +- crates/bevy_ecs/src/query/mod.rs | 4 ++-- crates/bevy_ecs/src/query/state.rs | 6 ++--- crates/bevy_ecs/src/system/mod.rs | 10 ++++----- crates/bevy_ecs/src/system/query.rs | 22 +++++++++---------- crates/bevy_ecs/src/system/system_param.rs | 2 +- crates/bevy_hierarchy/src/query_extension.rs | 4 ++-- crates/bevy_picking/src/pointer.rs | 2 +- crates/bevy_render/src/lib.rs | 2 +- crates/bevy_text/src/text2d.rs | 4 ++-- crates/bevy_ui/src/accessibility.rs | 2 +- crates/bevy_ui/src/layout/mod.rs | 6 ++--- .../src/render/ui_material_pipeline.rs | 2 +- crates/bevy_ui/src/ui_node.rs | 2 +- crates/bevy_ui/src/widget/image.rs | 2 +- crates/bevy_winit/src/accessibility.rs | 2 +- crates/bevy_winit/src/state.rs | 2 +- examples/2d/2d_viewport_to_world.rs | 4 ++-- examples/2d/bloom_2d.rs | 4 ++-- examples/2d/bounding_2d.rs | 2 +- examples/2d/pixel_grid_snap.rs | 2 +- examples/2d/rotation.rs | 6 ++--- examples/2d/sprite_animation.rs | 2 +- examples/2d/wireframe_2d.rs | 2 +- examples/3d/3d_viewport_to_world.rs | 6 ++--- examples/3d/anti_aliasing.rs | 6 ++--- examples/3d/atmospheric_fog.rs | 2 +- examples/3d/auto_exposure.rs | 6 ++--- examples/3d/blend_modes.rs | 4 ++-- examples/3d/bloom_3d.rs | 4 ++-- examples/3d/color_grading.rs | 6 ++--- examples/3d/deferred_rendering.rs | 2 +- examples/3d/fog.rs | 4 ++-- examples/3d/generate_custom_mesh.rs | 2 +- examples/3d/lighting.rs | 4 ++-- examples/3d/load_gltf_extras.rs | 2 +- examples/3d/motion_blur.rs | 8 +++---- examples/3d/parallax_mapping.rs | 8 +++---- examples/3d/pbr.rs | 4 ++-- examples/3d/shadow_biases.rs | 16 +++++++------- examples/3d/spotlight.rs | 2 +- examples/3d/ssao.rs | 6 ++--- examples/3d/tonemapping.rs | 22 ++++++++++--------- examples/3d/transmission.rs | 8 +++---- examples/3d/wireframe.rs | 2 +- examples/app/log_layers_ecs.rs | 2 +- examples/asset/multi_asset_sync.rs | 2 +- examples/audio/audio_control.rs | 6 ++--- examples/audio/spatial_audio_2d.rs | 2 +- examples/audio/spatial_audio_3d.rs | 2 +- examples/camera/2d_top_down_camera.rs | 6 ++--- examples/camera/first_person_view_model.rs | 4 ++-- examples/ecs/iter_combinations.rs | 4 ++-- examples/ecs/observers.rs | 4 ++-- examples/ecs/one_shot_systems.rs | 8 +++---- examples/ecs/parallel_query.rs | 2 +- examples/games/alien_cake_addict.rs | 2 +- examples/games/breakout.rs | 6 ++--- examples/games/contributors.rs | 4 ++-- examples/games/desk_toy.rs | 16 +++++++------- examples/games/game_menu.rs | 2 +- examples/games/loading_screen.rs | 4 ++-- examples/games/stepping.rs | 2 +- examples/gizmos/light_gizmos.rs | 4 ++-- examples/helpers/camera_controller.rs | 2 +- examples/input/mouse_grab.rs | 2 +- examples/input/text_input.rs | 22 +++++++++---------- examples/math/custom_primitives.rs | 2 +- examples/math/random_sampling.rs | 2 +- examples/math/render_primitives.rs | 4 ++-- examples/math/sampling_primitives.rs | 4 ++-- examples/mobile/src/lib.rs | 8 +++---- examples/movement/smooth_follow.rs | 6 ++--- .../shader/compute_shader_game_of_life.rs | 2 +- .../shader_material_screenspace_texture.rs | 2 +- examples/shader/shader_prepass.rs | 4 ++-- examples/state/custom_transitions.rs | 2 +- examples/stress_tests/bevymark.rs | 10 ++++----- .../stress_tests/many_animated_sprites.rs | 2 +- examples/stress_tests/many_cubes.rs | 2 +- examples/stress_tests/many_gizmos.rs | 2 +- examples/stress_tests/many_lights.rs | 2 +- examples/stress_tests/many_sprites.rs | 2 +- examples/tools/gamepad_viewer.rs | 2 +- .../tools/scene_viewer/morph_viewer_plugin.rs | 2 +- examples/transforms/align.rs | 14 ++++++------ examples/ui/overflow_debug.rs | 2 +- examples/ui/relative_cursor_position.rs | 4 ++-- examples/ui/size_constraints.rs | 2 +- examples/ui/window_fallthrough.rs | 2 +- examples/window/low_power.rs | 2 +- examples/window/scale_factor_override.rs | 8 +++---- examples/window/screenshot.rs | 2 +- examples/window/window_resizing.rs | 4 ++-- examples/window/window_settings.rs | 16 +++++++------- tests/window/change_window_mode.rs | 2 +- tests/window/minimising.rs | 2 +- tests/window/resizing.rs | 2 +- 105 files changed, 250 insertions(+), 248 deletions(-) diff --git a/benches/benches/bevy_ecs/scheduling/run_condition.rs b/benches/benches/bevy_ecs/scheduling/run_condition.rs index 9873f405a19b3..d6218efd6c9f1 100644 --- a/benches/benches/bevy_ecs/scheduling/run_condition.rs +++ b/benches/benches/bevy_ecs/scheduling/run_condition.rs @@ -68,7 +68,7 @@ pub fn run_condition_yes_with_query(criterion: &mut Criterion) { group.measurement_time(std::time::Duration::from_secs(3)); fn empty() {} fn yes_with_query(query: Query<&TestBool>) -> bool { - query.single().unwrap().0 + query.get_single().unwrap().0 } for amount in 0..21 { let mut schedule = Schedule::default(); diff --git a/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs b/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs index e9b882ce04b08..86be2146c73d7 100644 --- a/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs +++ b/crates/bevy_dev_tools/src/ui_debug_overlay/inset.rs @@ -134,7 +134,7 @@ impl<'w, 's> InsetGizmo<'w, 's> { } fn relative(&self, mut position: Vec2) -> Vec2 { let zero = GlobalTransform::IDENTITY; - let Ok(cam) = self.cam.single() else { + let Ok(cam) = self.cam.get_single() else { return Vec2::ZERO; }; if let Some(new_position) = cam.world_to_viewport(&zero, position.extend(0.)) { diff --git a/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs b/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs index 40e8055cd4568..6382cfa9038fb 100644 --- a/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs +++ b/crates/bevy_dev_tools/src/ui_debug_overlay/mod.rs @@ -199,7 +199,7 @@ fn outline_roots( you might notice gaps between container lines" ); } - let window_scale = window.single().map_or(1., Window::scale_factor); + let window_scale = window.get_single().map_or(1., Window::scale_factor); let scale_factor = outline.ui_scale.0; // We let the line be defined by the window scale alone diff --git a/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs b/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs index 62d76bec1695b..905de0d8140e8 100644 --- a/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs +++ b/crates/bevy_ecs/compile_fail/tests/ui/query_lifetime_safety.rs @@ -27,29 +27,29 @@ fn main() { } { - let data: &Foo = query.single().unwrap(); - let mut data2: Mut = query.single_mut().unwrap(); + let data: &Foo = query.get_single().unwrap(); + let mut data2: Mut = query.get_single_mut().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } { - let mut data2: Mut = query.single_mut().unwrap(); - let data: &Foo = query.single().unwrap(); + let mut data2: Mut = query.get_single_mut().unwrap(); + let data: &Foo = query.get_single().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } { - let data: &Foo = query.single().unwrap(); - let mut data2: Mut = query.single_mut().unwrap(); + let data: &Foo = query.get_single().unwrap(); + let mut data2: Mut = query.get_single_mut().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } { - let mut data2: Mut = query.single_mut().unwrap(); - let data: &Foo = query.single().unwrap(); + let mut data2: Mut = query.get_single_mut().unwrap(); + let data: &Foo = query.get_single().unwrap(); //~^ E0502 assert_eq!(data, &mut *data2); // oops UB } diff --git a/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs b/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs index b897ebd712bae..0aba2eac627f8 100644 --- a/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs +++ b/crates/bevy_ecs/compile_fail/tests/ui/query_to_readonly.rs @@ -35,13 +35,13 @@ fn for_loops(mut query: Query<&mut Foo>) { fn single_mut_query(mut query: Query<&mut Foo>) { // this should fail to compile { - let mut mut_foo = query.single_mut().unwrap(); + let mut mut_foo = query.get_single_mut().unwrap(); // This solves "temporary value dropped while borrowed" let readonly_query = query.to_readonly(); //~^ E0502 - let ref_foo = readonly_query.single().unwrap(); + let ref_foo = readonly_query.get_single().unwrap(); *mut_foo = Foo; @@ -53,9 +53,9 @@ fn single_mut_query(mut query: Query<&mut Foo>) { // This solves "temporary value dropped while borrowed" let readonly_query = query.to_readonly(); - let ref_foo = readonly_query.single().unwrap(); + let ref_foo = readonly_query.get_single().unwrap(); - let mut mut_foo = query.single_mut().unwrap(); + let mut mut_foo = query.get_single_mut().unwrap(); //~^ E0502 println!("{ref_foo:?}"); @@ -68,9 +68,9 @@ fn single_mut_query(mut query: Query<&mut Foo>) { // This solves "temporary value dropped while borrowed" let readonly_query = query.to_readonly(); - let readonly_foo = readonly_query.single().unwrap(); + let readonly_foo = readonly_query.get_single().unwrap(); - let query_foo = query.single().unwrap(); + let query_foo = query.get_single().unwrap(); println!("{readonly_foo:?}, {query_foo:?}"); } diff --git a/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs b/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs index 7518511feee26..5b832c1be6948 100644 --- a/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs +++ b/crates/bevy_ecs/compile_fail/tests/ui/query_transmute_safety.rs @@ -22,8 +22,8 @@ fn main() { let mut query_a = lens_a.query(); let mut query_b = lens_b.query(); - let a = query_a.single_mut().unwrap(); - let b = query_b.single_mut().unwrap(); // oops 2 mutable references to same Foo + let a = query_a.get_single_mut().unwrap(); + let b = query_b.get_single_mut().unwrap(); // oops 2 mutable references to same Foo assert_eq!(*a, *b); } @@ -34,8 +34,8 @@ fn main() { let mut query_b = lens.query(); //~^ E0499 - let a = query_a.single_mut().unwrap(); - let b = query_b.single_mut().unwrap(); // oops 2 mutable references to same Foo + let a = query_a.get_single_mut().unwrap(); + let b = query_b.get_single_mut().unwrap(); // oops 2 mutable references to same Foo assert_eq!(*a, *b); } } diff --git a/crates/bevy_ecs/src/change_detection.rs b/crates/bevy_ecs/src/change_detection.rs index fb2ed1cd8b5e0..d283e9606a69b 100644 --- a/crates/bevy_ecs/src/change_detection.rs +++ b/crates/bevy_ecs/src/change_detection.rs @@ -1068,11 +1068,11 @@ mod tests { #[test] fn change_expiration() { fn change_detected(query: Query>) -> bool { - query.single().unwrap().is_changed() + query.get_single().unwrap().is_changed() } fn change_expired(query: Query>) -> bool { - query.single().unwrap().is_changed() + query.get_single().unwrap().is_changed() } let mut world = World::new(); diff --git a/crates/bevy_ecs/src/query/error.rs b/crates/bevy_ecs/src/query/error.rs index f71fccb758561..1ce4b5a0f9d0c 100644 --- a/crates/bevy_ecs/src/query/error.rs +++ b/crates/bevy_ecs/src/query/error.rs @@ -22,7 +22,7 @@ pub enum QueryEntityError { } /// An error that occurs when evaluating a [`Query`](crate::system::Query) or [`QueryState`](crate::query::QueryState) as a single expected result via -/// [`single()`](crate::system::Query::single()) or [`single_mut`](crate::system::Query::single_mut). +/// [`get_single()`](crate::system::Query::get_single()) or [`single_mut`](crate::system::Query::single_mut). #[derive(Debug, Error)] pub enum QuerySingleError { /// No entity fits the query. diff --git a/crates/bevy_ecs/src/query/mod.rs b/crates/bevy_ecs/src/query/mod.rs index eec33a4141296..e21bb07c06094 100644 --- a/crates/bevy_ecs/src/query/mod.rs +++ b/crates/bevy_ecs/src/query/mod.rs @@ -771,9 +771,9 @@ mod tests { let _: Option<&Foo> = q.get(e).ok(); let _: Option<[&Foo; 1]> = q.get_many([e]).ok(); - let _: Option<&Foo> = q.single().ok(); + let _: Option<&Foo> = q.get_single().ok(); let _: [&Foo; 1] = q.many([e]); - let _: &Foo = q.single().unwrap(); + let _: &Foo = q.get_single().unwrap(); } // regression test for https://github.com/bevyengine/bevy/pull/8029 diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index a273e3114c241..5f4cba45bbfcc 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -1518,12 +1518,12 @@ impl QueryState { /// the query. /// /// This can only be called for read-only queries, - /// see [`single_mut`](Self::single_mut) for write-queries. + /// see [`get_single_mut`](Self::get_single_mut) for write-queries. /// /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned /// instead. #[inline] - pub fn single<'w>(&mut self, world: &'w World) -> Result, QuerySingleError> { + pub fn get_single<'w>(&mut self, world: &'w World) -> Result, QuerySingleError> { self.update_archetypes(world); // SAFETY: query is read only @@ -1542,7 +1542,7 @@ impl QueryState { /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned /// instead. #[inline] - pub fn single_mut<'w>( + pub fn get_single_mut<'w>( &mut self, world: &'w mut World, ) -> Result, QuerySingleError> { diff --git a/crates/bevy_ecs/src/system/mod.rs b/crates/bevy_ecs/src/system/mod.rs index bdb7c2b55c870..c557c3733fd14 100644 --- a/crates/bevy_ecs/src/system/mod.rs +++ b/crates/bevy_ecs/src/system/mod.rs @@ -1185,7 +1185,7 @@ mod tests { let (a, query, _) = system_state.get(&world); assert_eq!(*a, A(42), "returned resource matches initial value"); assert_eq!( - *query.single().unwrap(), + *query.get_single().unwrap(), B(7), "returned component matches initial value" ); @@ -1212,7 +1212,7 @@ mod tests { let (a, mut query) = system_state.get_mut(&mut world); assert_eq!(*a, A(42), "returned resource matches initial value"); assert_eq!( - *query.single_mut().unwrap(), + *query.get_single_mut().unwrap(), B(7), "returned component matches initial value" ); @@ -1229,18 +1229,18 @@ mod tests { let mut system_state: SystemState>> = SystemState::new(&mut world); { let query = system_state.get(&world); - assert_eq!(*query.single().unwrap(), A(1)); + assert_eq!(*query.get_single().unwrap(), A(1)); } { let query = system_state.get(&world); - assert!(query.single().is_err()); + assert!(query.get_single().is_err()); } world.entity_mut(entity).get_mut::().unwrap().0 = 2; { let query = system_state.get(&world); - assert_eq!(*query.single().unwrap(), A(2)); + assert_eq!(*query.get_single().unwrap(), A(2)); } } diff --git a/crates/bevy_ecs/src/system/query.rs b/crates/bevy_ecs/src/system/query.rs index b5bfccab06431..0493628f080c5 100644 --- a/crates/bevy_ecs/src/system/query.rs +++ b/crates/bevy_ecs/src/system/query.rs @@ -244,7 +244,7 @@ use std::borrow::Borrow; /// |[`iter_combinations`]\[[`_mut`][`iter_combinations_mut`]]|Returns an iterator over all combinations of a specified number of query items.| /// |[`get`]\[[`_mut`][`get_mut`]]|Returns the query item for the specified entity.| /// |[`many`]\[[`_mut`][`many_mut`]],
[`get_many`]\[[`_mut`][`get_many_mut`]]|Returns the query items for the specified entities.| -/// |[`single`]\[[`_mut`][`single_mut`]],
[`single()`]\[[`_mut`][`single_mut`]]|Returns the query item while verifying that there aren't others.| +/// |[`single`]\[[`_mut`][`single_mut`]],
[`get_single()`]\[[`_mut`][`single_mut`]]|Returns the query item while verifying that there aren't others.| /// /// There are two methods for each type of query operation: immutable and mutable (ending with `_mut`). /// When using immutable methods, the query items returned are of type [`ROQueryItem`], a read-only version of the query item. @@ -281,7 +281,7 @@ use std::borrow::Borrow; /// |[`get`]\[[`_mut`][`get_mut`]]|O(1)| /// |([`get_`][`get_many`])[`many`]|O(k)| /// |([`get_`][`get_many_mut`])[`many_mut`]|O(k2)| -/// |[`single`]\[[`_mut`][`single_mut`]],
[`single()`]\[[`_mut`][`single_mut`]]|O(a)| +/// |[`single`]\[[`_mut`][`single_mut`]],
[`get_single()`]\[[`_mut`][`single_mut`]]|O(a)| /// |Archetype based filtering ([`With`], [`Without`], [`Or`])|O(a)| /// |Change detection filtering ([`Added`], [`Changed`])|O(a + n)| /// @@ -325,7 +325,7 @@ use std::borrow::Borrow; /// [`get_many`]: Self::get_many /// [`get_many_mut`]: Self::get_many_mut /// [`get_mut`]: Self::get_mut -/// [`single()`]: Self::single() +/// [`get_single()`]: Self::get_single() /// [`single_mut`]: Self::single_mut /// [`iter`]: Self::iter /// [`iter_combinations`]: Self::iter_combinations @@ -1083,7 +1083,7 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// # #[derive(Component)] /// # struct PlayerScore(i32); /// fn player_scoring_system(query: Query<&PlayerScore>) { - /// match query.single().unwrap() { + /// match query.get_single().unwrap() { /// Ok(PlayerScore(score)) => { /// println!("Score: {}", score); /// } @@ -1100,9 +1100,9 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// /// # See also /// - /// - [`single_mut`](Self::single_mut) to get the mutable query item. + /// - [`get_single_mut`](Self::get_single_mut) to get the mutable query item. #[inline] - pub fn single(&self) -> Result, QuerySingleError> { + pub fn get_single(&self) -> Result, QuerySingleError> { // SAFETY: // the query ensures that the components it accesses are not mutably accessible somewhere else // and the query is read only. @@ -1130,7 +1130,7 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// # struct Health(u32); /// # /// fn regenerate_player_health_system(mut query: Query<&mut Health, With>) { - /// let mut health = query.single_mut().unwrap().expect("Error: Could not find a single player."); + /// let mut health = query.get_single_mut().unwrap().expect("Error: Could not find a single player."); /// health.0 += 1; /// } /// # bevy_ecs::system::assert_is_system(regenerate_player_health_system); @@ -1138,10 +1138,10 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// /// # See also /// - /// - [`single`](Self::single) to get the read-only query item. - /// - [`single_mut`](Self::single_mut) for the panicking version. + /// - [`get_single`](Self::get_single) to get the read-only query item. + /// - [`get_single_mut`](Self::get_single_mut) for the panicking version. #[inline] - pub fn single_mut(&mut self) -> Result, QuerySingleError> { + pub fn get_single_mut(&mut self) -> Result, QuerySingleError> { // SAFETY: // the query ensures mutable access to the components it accesses, and the query // is uniquely borrowed @@ -1255,7 +1255,7 @@ impl<'w, 's, D: QueryData, F: QueryFilter> Query<'w, 's, D, F> { /// # world.spawn((A(10), B(5))); /// # /// fn reusable_function(lens: &mut QueryLens<&A>) { - /// assert_eq!(lens.query().single().unwrap().0, 10); + /// assert_eq!(lens.query().get_single().unwrap().0, 10); /// } /// /// // We can use the function in a system that takes the exact query. diff --git a/crates/bevy_ecs/src/system/system_param.rs b/crates/bevy_ecs/src/system/system_param.rs index db1cece665954..f4983d94e0258 100644 --- a/crates/bevy_ecs/src/system/system_param.rs +++ b/crates/bevy_ecs/src/system/system_param.rs @@ -945,7 +945,7 @@ pub trait SystemBuffer: FromWorld + Send + 'static { /// criminals: Query<&Criminal>, /// mut alarm: Deferred /// ) { -/// let settlement = settlements.single().unwrap(); +/// let settlement = settlements.get_single().unwrap(); /// for criminal in &criminals { /// // Only sound the alarm if the criminal is a threat. /// // For this example, assume that this check is expensive to run. diff --git a/crates/bevy_hierarchy/src/query_extension.rs b/crates/bevy_hierarchy/src/query_extension.rs index 7fdaf06060832..e18176a4c6336 100644 --- a/crates/bevy_hierarchy/src/query_extension.rs +++ b/crates/bevy_hierarchy/src/query_extension.rs @@ -23,7 +23,7 @@ pub trait HierarchyQueryExt<'w, 's, D: QueryData, F: QueryFilter> { /// # #[derive(Component)] /// # struct Marker; /// fn system(query: Query>, children_query: Query<&Children>) { - /// let entity = query.single().unwrap(); + /// let entity = query.get_single().unwrap(); /// for descendant in children_query.iter_descendants(entity) { /// // Do something! /// } @@ -45,7 +45,7 @@ pub trait HierarchyQueryExt<'w, 's, D: QueryData, F: QueryFilter> { /// # #[derive(Component)] /// # struct Marker; /// fn system(query: Query>, parent_query: Query<&Parent>) { - /// let entity = query.single().unwrap(); + /// let entity = query.get_single().unwrap(); /// for ancestor in parent_query.iter_ancestors(entity) { /// // Do something! /// } diff --git a/crates/bevy_picking/src/pointer.rs b/crates/bevy_picking/src/pointer.rs index 2a6754421d749..3d1991c1ec246 100644 --- a/crates/bevy_picking/src/pointer.rs +++ b/crates/bevy_picking/src/pointer.rs @@ -289,7 +289,7 @@ impl Location { ) -> bool { if camera .target - .normalize(Some(match primary_window.single() { + .normalize(Some(match primary_window.get_single() { Ok(w) => w, Err(_) => return false, })) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index e530004f9781c..49f25530b1323 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -270,7 +270,7 @@ impl Plugin for RenderPlugin { let mut system_state: SystemState< Query<&RawHandleWrapperHolder, With>, > = SystemState::new(app.world_mut()); - let primary_window = system_state.get(app.world()).single().ok().cloned(); + let primary_window = system_state.get(app.world()).get_single().ok().cloned(); let settings = render_creation.clone(); let async_renderer = async move { let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { diff --git a/crates/bevy_text/src/text2d.rs b/crates/bevy_text/src/text2d.rs index 4d7284812193d..8c28fe3079aca 100644 --- a/crates/bevy_text/src/text2d.rs +++ b/crates/bevy_text/src/text2d.rs @@ -82,7 +82,7 @@ pub fn extract_text2d_sprite( ) { // TODO: Support window-independent scaling: https://github.com/bevyengine/bevy/issues/5621 let scale_factor = windows - .single() + .get_single() .map(|window| window.resolution.scale_factor()) .unwrap_or(1.0); let scaling = GlobalTransform::from_scale(Vec2::splat(scale_factor.recip()).extend(1.)); @@ -164,7 +164,7 @@ pub fn update_text2d_layout( // TODO: Support window-independent scaling: https://github.com/bevyengine/bevy/issues/5621 let scale_factor = windows - .single() + .get_single() .map(|window| window.resolution.scale_factor()) .unwrap_or(1.0); diff --git a/crates/bevy_ui/src/accessibility.rs b/crates/bevy_ui/src/accessibility.rs index 06dbe453a5192..cbcf8e82d36ca 100644 --- a/crates/bevy_ui/src/accessibility.rs +++ b/crates/bevy_ui/src/accessibility.rs @@ -38,7 +38,7 @@ fn calc_bounds( camera: Query<(&Camera, &GlobalTransform)>, mut nodes: Query<(&mut AccessibilityNode, Ref, Ref)>, ) { - if let Ok((camera, camera_transform)) = camera.single() { + if let Ok((camera, camera_transform)) = camera.get_single() { for (mut accessible, node, transform) in &mut nodes { if node.is_changed() || transform.is_changed() { if let Some(translation) = diff --git a/crates/bevy_ui/src/layout/mod.rs b/crates/bevy_ui/src/layout/mod.rs index ba1c6f955f99f..f3dbd67a4714f 100644 --- a/crates/bevy_ui/src/layout/mod.rs +++ b/crates/bevy_ui/src/layout/mod.rs @@ -115,7 +115,7 @@ pub fn ui_layout_system( let scale_factor = camera.target_scaling_factor().unwrap_or(1.0); let camera_target = camera .target - .normalize(primary_window.single().map(|(e, _)| e).ok()); + .normalize(primary_window.get_single().map(|(e, _)| e).ok()); let resized = matches!(camera_target, Some(NormalizedRenderTarget::Window(window_ref)) if resized_windows.contains(&window_ref.entity()) ); @@ -302,7 +302,7 @@ pub fn resolve_outlines_system( mut outlines_query: Query<(&Outline, &mut Node)>, ) { let viewport_size = primary_window - .single() + .get_single() .map(Window::size) .unwrap_or(Vec2::ZERO) / ui_scale.0; @@ -772,7 +772,7 @@ mod tests { mut cameras: Query<&mut Camera>, ) { let primary_window = primary_window_query - .single() + .get_single() .expect("missing primary window"); let camera_count = cameras.iter().len(); for (camera_index, mut camera) in cameras.iter_mut().enumerate() { diff --git a/crates/bevy_ui/src/render/ui_material_pipeline.rs b/crates/bevy_ui/src/render/ui_material_pipeline.rs index b6739c9a13b2c..49eee2ed25579 100644 --- a/crates/bevy_ui/src/render/ui_material_pipeline.rs +++ b/crates/bevy_ui/src/render/ui_material_pipeline.rs @@ -376,7 +376,7 @@ pub fn extract_ui_material_nodes( ui_scale: Extract>, ) { let ui_logical_viewport_size = windows - .single() + .get_single() .map(Window::size) .unwrap_or(Vec2::ZERO) // The logical window resolution returned by `Window` only takes into account the window scale factor and not `UiScale`, diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index f12800c153f11..5e918e4d1ca8e 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -2304,7 +2304,7 @@ pub struct DefaultUiCamera<'w, 's> { impl<'w, 's> DefaultUiCamera<'w, 's> { pub fn get(&self) -> Option { - self.default_cameras.single().ok().or_else(|| { + self.default_cameras.get_single().ok().or_else(|| { // If there isn't a single camera and the query isn't empty, there is two or more cameras queried. if !self.default_cameras.is_empty() { warn_once!("Two or more Entities with IsDefaultUiCamera found when only one Camera with this marker is allowed."); diff --git a/crates/bevy_ui/src/widget/image.rs b/crates/bevy_ui/src/widget/image.rs index be4e38f478ab2..cf04384404bda 100644 --- a/crates/bevy_ui/src/widget/image.rs +++ b/crates/bevy_ui/src/widget/image.rs @@ -111,7 +111,7 @@ pub fn update_image_content_size_system( >, ) { let combined_scale_factor = windows - .single() + .get_single() .map(|window| window.resolution.scale_factor()) .unwrap_or(1.) * ui_scale.0; diff --git a/crates/bevy_winit/src/accessibility.rs b/crates/bevy_winit/src/accessibility.rs index 3467361e09c48..e72c6c8cfe79c 100644 --- a/crates/bevy_winit/src/accessibility.rs +++ b/crates/bevy_winit/src/accessibility.rs @@ -189,7 +189,7 @@ fn update_accessibility_nodes( )>, node_entities: Query>, ) { - let Ok((primary_window_id, primary_window)) = primary_window.single() else { + let Ok((primary_window_id, primary_window)) = primary_window.get_single() else { return; }; let Some(adapter) = adapters.get_mut(&primary_window_id) else { diff --git a/crates/bevy_winit/src/state.rs b/crates/bevy_winit/src/state.rs index 5da63bb5ef962..6c889cd046ca4 100644 --- a/crates/bevy_winit/src/state.rs +++ b/crates/bevy_winit/src/state.rs @@ -463,7 +463,7 @@ impl ApplicationHandler for WinitAppRunnerState { // handle wrapper removed when the app was suspended. let mut query = self.world_mut() .query_filtered::<(Entity, &Window), (With, Without)>(); - if let Ok((entity, window)) = query.single()(&self.world()) { + if let Ok((entity, window)) = query.get_single()(&self.world()) { let window = window.clone(); let mut create_window = diff --git a/examples/2d/2d_viewport_to_world.rs b/examples/2d/2d_viewport_to_world.rs index 98e1f31847434..312e6c0b8a17c 100644 --- a/examples/2d/2d_viewport_to_world.rs +++ b/examples/2d/2d_viewport_to_world.rs @@ -15,9 +15,9 @@ fn draw_cursor( windows: Query<&Window>, mut gizmos: Gizmos, ) { - let (camera, camera_transform) = camera_query.single().unwrap(); + let (camera, camera_transform) = camera_query.get_single().unwrap(); - let Some(cursor_position) = windows.single().unwrap().cursor_position() else { + let Some(cursor_position) = windows.get_single().unwrap().cursor_position() else { return; }; diff --git a/examples/2d/bloom_2d.rs b/examples/2d/bloom_2d.rs index e6f9c1a2e6a62..ea6e585bc1c63 100644 --- a/examples/2d/bloom_2d.rs +++ b/examples/2d/bloom_2d.rs @@ -84,8 +84,8 @@ fn update_bloom_settings( keycode: Res>, time: Res
() .without::() .build(); - assert_eq!(entity_a, query_a.single(&world).unwrap()); + assert_eq!(entity_a, query_a.get_single(&world).unwrap()); let mut query_b = QueryBuilder::::new(&mut world) .with::() .without::() .build(); - assert_eq!(entity_b, query_b.single(&world).unwrap()); + assert_eq!(entity_b, query_b.get_single(&world).unwrap()); } #[test] @@ -294,13 +294,13 @@ mod tests { .with_id(component_id_a) .without_id(component_id_c) .build(); - assert_eq!(entity_a, query_a.single(&world).unwrap()); + assert_eq!(entity_a, query_a.get_single(&world).unwrap()); let mut query_b = QueryBuilder::::new(&mut world) .with_id(component_id_a) .without_id(component_id_b) .build(); - assert_eq!(entity_b, query_b.single(&world).unwrap()); + assert_eq!(entity_b, query_b.get_single(&world).unwrap()); } #[test] @@ -360,7 +360,7 @@ mod tests { .data::<&B>() .build(); - let entity_ref = query.single(&world).unwrap(); + let entity_ref = query.get_single(&world).unwrap(); assert_eq!(entity, entity_ref.id()); @@ -383,7 +383,7 @@ mod tests { .ref_id(component_id_b) .build(); - let entity_ref = query.single(&world).unwrap(); + let entity_ref = query.get_single(&world).unwrap(); assert_eq!(entity, entity_ref.id()); diff --git a/crates/bevy_ecs/src/query/mod.rs b/crates/bevy_ecs/src/query/mod.rs index e21bb07c06094..fc89627d6dc7d 100644 --- a/crates/bevy_ecs/src/query/mod.rs +++ b/crates/bevy_ecs/src/query/mod.rs @@ -758,8 +758,8 @@ mod tests { let _: Option<&Foo> = q.get(&world, e).ok(); let _: Option<&Foo> = q.get_manual(&world, e).ok(); let _: Option<[&Foo; 1]> = q.get_many(&world, [e]).ok(); - let _: Option<&Foo> = q.single(&world).ok(); - let _: &Foo = q.single(&world).unwrap(); + let _: Option<&Foo> = q.get_single(&world).ok(); + let _: &Foo = q.get_single(&world).unwrap(); // system param let mut q = SystemState::>::new(&mut world); diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index 5f4cba45bbfcc..54d2610c7195f 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -1523,7 +1523,10 @@ impl QueryState { /// If the number of query results is not exactly one, a [`QuerySingleError`] is returned /// instead. #[inline] - pub fn get_single<'w>(&mut self, world: &'w World) -> Result, QuerySingleError> { + pub fn get_single<'w>( + &mut self, + world: &'w World, + ) -> Result, QuerySingleError> { self.update_archetypes(world); // SAFETY: query is read only @@ -1742,7 +1745,7 @@ mod tests { let query_state = world.query::<(&A, &B)>(); let mut new_query_state = query_state.transmute::<&A>(world.components()); assert_eq!(new_query_state.iter(&world).len(), 1); - let a = new_query_state.single(&world).unwrap(); + let a = new_query_state.get_single(&world).unwrap(); assert_eq!(a.0, 1); } @@ -1756,7 +1759,7 @@ mod tests { let query_state = world.query_filtered::<(&A, &B), Without>(); let mut new_query_state = query_state.transmute::<&A>(world.components()); // even though we change the query to not have Without, we do not get the component with C. - let a = new_query_state.single(&world).unwrap(); + let a = new_query_state.get_single(&world).unwrap(); assert_eq!(a.0, 0); } @@ -1769,7 +1772,7 @@ mod tests { let q = world.query::<()>(); let mut q = q.transmute::(world.components()); - assert_eq!(q.single(&world).unwrap(), entity); + assert_eq!(q.get_single(&world).unwrap(), entity); } #[test] @@ -1779,7 +1782,7 @@ mod tests { let q = world.query::<&A>(); let mut new_q = q.transmute::>(world.components()); - assert!(new_q.single(&world).unwrap().is_added()); + assert!(new_q.get_single(&world).unwrap().is_added()); let q = world.query::>(); let _ = q.transmute::<&A>(world.components()); @@ -1850,7 +1853,7 @@ mod tests { let query_state = world.query::>(); let mut new_query_state = query_state.transmute::<&A>(world.components()); - let x = new_query_state.single(&world).unwrap(); + let x = new_query_state.get_single(&world).unwrap(); assert_eq!(x.0, 1234); } @@ -1875,7 +1878,7 @@ mod tests { let mut query = query; // Our result is completely untyped - let entity_ref = query.single(&world).unwrap(); + let entity_ref = query.get_single(&world).unwrap(); assert_eq!(entity, entity_ref.id()); assert_eq!(0, entity_ref.get::().unwrap().0); @@ -1890,16 +1893,16 @@ mod tests { let mut query = QueryState::<(Entity, &A, Has)>::new(&mut world) .transmute_filtered::<(Entity, Has), Added>(world.components()); - assert_eq!((entity_a, false), query.single(&world).unwrap()); + assert_eq!((entity_a, false), query.get_single(&world).unwrap()); world.clear_trackers(); let entity_b = world.spawn((A(0), B(0))).id(); - assert_eq!((entity_b, true), query.single(&world).unwrap()); + assert_eq!((entity_b, true), query.get_single(&world).unwrap()); world.clear_trackers(); - assert!(query.single(&world).is_err()); + assert!(query.get_single(&world).is_err()); } #[test] @@ -1911,15 +1914,15 @@ mod tests { .transmute_filtered::>(world.components()); let mut change_query = QueryState::<&mut A>::new(&mut world); - assert_eq!(entity_a, detection_query.single(&world).unwrap()); + assert_eq!(entity_a, detection_query.get_single(&world).unwrap()); world.clear_trackers(); - assert!(detection_query.single(&world).is_err()); + assert!(detection_query.get_single(&world).is_err()); - change_query.single_mut(&mut world).unwrap().0 = 1; + change_query.get_single_mut(&mut world).unwrap().0 = 1; - assert_eq!(entity_a, detection_query.single(&world).unwrap()); + assert_eq!(entity_a, detection_query.get_single(&world).unwrap()); } #[test] @@ -1947,7 +1950,7 @@ mod tests { let mut new_query: QueryState = query_1.join_filtered(world.components(), &query_2); - assert_eq!(new_query.single(&world).unwrap(), entity_ab); + assert_eq!(new_query.get_single(&world).unwrap(), entity_ab); } #[test] diff --git a/crates/bevy_ecs/src/world/entity_ref.rs b/crates/bevy_ecs/src/world/entity_ref.rs index 2d1073e0fd09f..3aaa75a6aa298 100644 --- a/crates/bevy_ecs/src/world/entity_ref.rs +++ b/crates/bevy_ecs/src/world/entity_ref.rs @@ -1389,11 +1389,11 @@ impl<'w> EntityWorldMut<'w> { /// let mut entity = world.spawn_empty(); /// entity.entry().or_insert_with(|| Comp(4)); /// # let entity_id = entity.id(); - /// assert_eq!(world.query::<&Comp>().single(&world).0, 4); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 4); /// /// # let mut entity = world.get_entity_mut(entity_id).unwrap(); /// entity.entry::().and_modify(|mut c| c.0 += 1); - /// assert_eq!(world.query::<&Comp>().single(&world).0, 5); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 5); /// /// ``` pub fn entry<'a, T: Component>(&'a mut self) -> Entry<'w, 'a, T> { @@ -1461,7 +1461,7 @@ impl<'w, 'a, T: Component> Entry<'w, 'a, T> { /// let mut entity = world.spawn(Comp(0)); /// /// entity.entry::().and_modify(|mut c| c.0 += 1); - /// assert_eq!(world.query::<&Comp>().single(&world).0, 1); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 1); /// ``` #[inline] pub fn and_modify)>(self, f: F) -> Self { @@ -1518,11 +1518,11 @@ impl<'w, 'a, T: Component> Entry<'w, 'a, T> { /// /// entity.entry().or_insert(Comp(4)); /// # let entity_id = entity.id(); - /// assert_eq!(world.query::<&Comp>().single(&world).0, 4); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 4); /// /// # let mut entity = world.get_entity_mut(entity_id).unwrap(); /// entity.entry().or_insert(Comp(15)).0 *= 2; - /// assert_eq!(world.query::<&Comp>().single(&world).0, 8); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 8); /// ``` #[inline] pub fn or_insert(self, default: T) -> Mut<'a, T> { @@ -1546,7 +1546,7 @@ impl<'w, 'a, T: Component> Entry<'w, 'a, T> { /// let mut entity = world.spawn_empty(); /// /// entity.entry().or_insert_with(|| Comp(4)); - /// assert_eq!(world.query::<&Comp>().single(&world).0, 4); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 4); /// ``` #[inline] pub fn or_insert_with T>(self, default: F) -> Mut<'a, T> { @@ -1572,7 +1572,7 @@ impl<'w, 'a, T: Component + Default> Entry<'w, 'a, T> { /// let mut entity = world.spawn_empty(); /// /// entity.entry::().or_default(); - /// assert_eq!(world.query::<&Comp>().single(&world).0, 0); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 0); /// ``` #[inline] pub fn or_default(self) -> Mut<'a, T> { @@ -1639,7 +1639,7 @@ impl<'w, 'a, T: Component> OccupiedEntry<'w, 'a, T> { /// o.get_mut().0 += 2 /// } /// - /// assert_eq!(world.query::<&Comp>().single(&world).0, 17); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 17); /// ``` #[inline] pub fn get_mut(&mut self) -> Mut<'_, T> { @@ -1668,7 +1668,7 @@ impl<'w, 'a, T: Component> OccupiedEntry<'w, 'a, T> { /// o.into_mut().0 += 10; /// } /// - /// assert_eq!(world.query::<&Comp>().single(&world).0, 15); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 15); /// ``` #[inline] pub fn into_mut(self) -> Mut<'a, T> { @@ -1692,7 +1692,7 @@ impl<'w, 'a, T: Component> OccupiedEntry<'w, 'a, T> { /// o.insert(Comp(10)); /// } /// - /// assert_eq!(world.query::<&Comp>().single(&world).0, 10); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 10); /// ``` #[inline] pub fn insert(&mut self, component: T) { @@ -1747,7 +1747,7 @@ impl<'w, 'a, T: Component> VacantEntry<'w, 'a, T> { /// v.insert(Comp(10)); /// } /// - /// assert_eq!(world.query::<&Comp>().single(&world).0, 10); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 10); /// ``` #[inline] pub fn insert(self, component: T) -> Mut<'a, T> { @@ -1772,7 +1772,7 @@ impl<'w, 'a, T: Component> VacantEntry<'w, 'a, T> { /// v.insert_entry(Comp(10)); /// } /// - /// assert_eq!(world.query::<&Comp>().single(&world).0, 10); + /// assert_eq!(world.query::<&Comp>().get_single(&world).0, 10); /// ``` #[inline] pub fn insert_entry(self, component: T) -> OccupiedEntry<'w, 'a, T> { diff --git a/crates/bevy_scene/src/bundle.rs b/crates/bevy_scene/src/bundle.rs index dc7cbced91fd8..33c5eba7d6fee 100644 --- a/crates/bevy_scene/src/bundle.rs +++ b/crates/bevy_scene/src/bundle.rs @@ -157,7 +157,7 @@ mod tests { let (scene_entity, scene_component_a) = app .world_mut() .query::<(Entity, &ComponentA)>() - .single(app.world()) + .get_single(app.world()) .unwrap(); assert_eq!(scene_component_a.x, 3.0); assert_eq!(scene_component_a.y, 4.0); diff --git a/crates/bevy_scene/src/scene_spawner.rs b/crates/bevy_scene/src/scene_spawner.rs index 3d5d737c328c7..c9117a0806e0a 100644 --- a/crates/bevy_scene/src/scene_spawner.rs +++ b/crates/bevy_scene/src/scene_spawner.rs @@ -502,7 +502,7 @@ mod tests { let mut scene_spawner = SceneSpawner::default(); let entity = world .query_filtered::>() - .single(&world) + .get_single(&world) .unwrap(); let scene = DynamicSceneBuilder::from_world(&world) .extract_entity(entity) diff --git a/crates/bevy_scene/src/serde.rs b/crates/bevy_scene/src/serde.rs index d236e8591d195..b5ac7478c99c4 100644 --- a/crates/bevy_scene/src/serde.rs +++ b/crates/bevy_scene/src/serde.rs @@ -714,12 +714,12 @@ mod tests { let bar_to_foo = dst_world .query_filtered::<&MyEntityRef, Without>() - .single(&dst_world) + .get_single(&dst_world) .cloned() .unwrap(); let foo = dst_world .query_filtered::>() - .single(&dst_world) + .get_single(&dst_world) .unwrap(); assert_eq!(foo, bar_to_foo.0); diff --git a/crates/bevy_ui/src/layout/mod.rs b/crates/bevy_ui/src/layout/mod.rs index f3dbd67a4714f..886cef8b9cb4a 100644 --- a/crates/bevy_ui/src/layout/mod.rs +++ b/crates/bevy_ui/src/layout/mod.rs @@ -829,7 +829,7 @@ mod tests { ui_schedule.run(world); let (ui_node_entity, TargetCamera(target_camera_entity)) = world .query_filtered::<(Entity, &TargetCamera), With>() - .single(world) + .get_single(world) .expect("missing MovingUiNode"); assert_eq!(expected_camera_entity, target_camera_entity); let ui_surface = world.resource::(); diff --git a/crates/bevy_winit/src/state.rs b/crates/bevy_winit/src/state.rs index 6c889cd046ca4..e22978242712b 100644 --- a/crates/bevy_winit/src/state.rs +++ b/crates/bevy_winit/src/state.rs @@ -443,7 +443,7 @@ impl ApplicationHandler for WinitAppRunnerState { let mut query = self .world_mut() .query_filtered::>(); - let entity = query.single(&self.world()); + let entity = query.get_single(&self.world()); self.world_mut() .entity_mut(entity) .remove::();