From 1b7db895b7ee71a2c2cfb8bd14eeb37c56ff9b44 Mon Sep 17 00:00:00 2001 From: raldone01 Date: Sun, 9 Feb 2025 19:45:45 +0000 Subject: [PATCH] Harden proc macro path resolution and add integration tests. (#17330) This pr uses the `extern crate self as` trick to make proc macros behave the same way inside and outside bevy. # Objective - Removes noise introduced by `crate as` in the whole bevy repo. - Fixes #17004. - Hardens proc macro path resolution. ## TODO - [x] `BevyManifest` needs cleanup. - [x] Cleanup remaining `crate as`. - [x] Add proper integration tests to the ci. ## Notes - `cargo-manifest-proc-macros` is written by me and based/inspired by the old `BevyManifest` implementation and [`bkchr/proc-macro-crate`](https://github.com/bkchr/proc-macro-crate). - What do you think about the new integration test machinery I added to the `ci`? More and better integration tests can be added at a later stage. The goal of these integration tests is to simulate an actual separate crate that uses bevy. Ideally they would lightly touch all bevy crates. ## Testing - Needs RA test - Needs testing from other users - Others need to run at least `cargo run -p ci integration-test` and verify that they work. --------- Co-authored-by: Alice Cecile --- .gitignore | 1 + Cargo.toml | 11 +++ benches/benches/bevy_ecs/change_detection.rs | 2 +- .../bevy_ecs/components/archetype_updates.rs | 2 +- benches/benches/bevy_ecs/empty_archetypes.rs | 30 +++--- .../bevy_ecs/iteration/par_iter_simple.rs | 2 +- crates/bevy_app/src/app.rs | 2 - crates/bevy_app/src/lib.rs | 3 + crates/bevy_asset/src/asset_changed.rs | 2 +- crates/bevy_asset/src/assets.rs | 5 +- crates/bevy_asset/src/folder.rs | 1 - crates/bevy_asset/src/lib.rs | 4 +- crates/bevy_asset/src/meta.rs | 4 +- crates/bevy_asset/src/reflect.rs | 1 - crates/bevy_asset/src/server/loaders.rs | 2 +- crates/bevy_ecs/src/bundle.rs | 1 - crates/bevy_ecs/src/change_detection.rs | 1 - crates/bevy_ecs/src/component.rs | 1 - crates/bevy_ecs/src/entity/clone_entities.rs | 8 +- crates/bevy_ecs/src/entity/entity_set.rs | 1 - crates/bevy_ecs/src/entity/visit_entities.rs | 1 - crates/bevy_ecs/src/entity_disabling.rs | 1 - crates/bevy_ecs/src/event/base.rs | 1 - crates/bevy_ecs/src/event/collections.rs | 3 +- crates/bevy_ecs/src/event/event_cursor.rs | 1 - crates/bevy_ecs/src/event/iterators.rs | 1 - crates/bevy_ecs/src/event/mod.rs | 1 - crates/bevy_ecs/src/event/mut_iterators.rs | 1 - crates/bevy_ecs/src/event/mutator.rs | 1 - crates/bevy_ecs/src/event/reader.rs | 1 - crates/bevy_ecs/src/event/registry.rs | 1 - crates/bevy_ecs/src/event/update.rs | 1 - crates/bevy_ecs/src/event/writer.rs | 1 - crates/bevy_ecs/src/hierarchy.rs | 1 - crates/bevy_ecs/src/identifier/mod.rs | 2 +- crates/bevy_ecs/src/lib.rs | 4 +- crates/bevy_ecs/src/name.rs | 2 +- .../bevy_ecs/src/observer/entity_observer.rs | 4 +- crates/bevy_ecs/src/observer/mod.rs | 1 - crates/bevy_ecs/src/query/builder.rs | 1 - crates/bevy_ecs/src/query/error.rs | 1 - crates/bevy_ecs/src/query/fetch.rs | 5 +- crates/bevy_ecs/src/query/iter.rs | 3 +- crates/bevy_ecs/src/query/mod.rs | 1 - crates/bevy_ecs/src/query/state.rs | 1 - .../bevy_ecs/src/reflect/entity_commands.rs | 1 - crates/bevy_ecs/src/reflect/mod.rs | 1 - crates/bevy_ecs/src/relationship/mod.rs | 1 - .../src/relationship/related_methods.rs | 1 - .../relationship_source_collection.rs | 1 - crates/bevy_ecs/src/removal_detection.rs | 1 - crates/bevy_ecs/src/schedule/condition.rs | 1 - crates/bevy_ecs/src/schedule/executor/mod.rs | 1 - .../src/schedule/executor/multi_threaded.rs | 3 - crates/bevy_ecs/src/schedule/mod.rs | 3 - crates/bevy_ecs/src/schedule/schedule.rs | 2 - crates/bevy_ecs/src/schedule/set.rs | 6 +- crates/bevy_ecs/src/schedule/stepping.rs | 4 - crates/bevy_ecs/src/storage/blob_array.rs | 1 - crates/bevy_ecs/src/storage/blob_vec.rs | 1 - crates/bevy_ecs/src/storage/sparse_set.rs | 1 - crates/bevy_ecs/src/storage/table/mod.rs | 1 - crates/bevy_ecs/src/system/builder.rs | 1 - crates/bevy_ecs/src/system/commands/mod.rs | 2 - .../src/system/commands/parallel_scope.rs | 1 - .../src/system/exclusive_system_param.rs | 1 - crates/bevy_ecs/src/system/mod.rs | 1 - crates/bevy_ecs/src/system/observer_system.rs | 1 - crates/bevy_ecs/src/system/system.rs | 1 - crates/bevy_ecs/src/system/system_param.rs | 5 +- crates/bevy_ecs/src/system/system_registry.rs | 2 - crates/bevy_ecs/src/world/command_queue.rs | 2 +- .../bevy_ecs/src/world/component_constants.rs | 1 - crates/bevy_ecs/src/world/entity_ref.rs | 1 - crates/bevy_ecs/src/world/mod.rs | 3 - crates/bevy_ecs/src/world/reflect.rs | 6 +- .../bevy_ecs/src/world/unsafe_world_cell.rs | 1 - crates/bevy_encase_derive/src/lib.rs | 2 +- crates/bevy_gizmos/src/aabb.rs | 2 - crates/bevy_gizmos/src/config.rs | 1 - crates/bevy_gizmos/src/lib.rs | 3 + crates/bevy_gizmos/src/light.rs | 2 +- crates/bevy_macro_utils/Cargo.toml | 4 +- crates/bevy_macro_utils/src/bevy_manifest.rs | 98 +++++++------------ .../derive/src/trait_reflection.rs | 7 +- crates/bevy_reflect/src/array.rs | 6 +- crates/bevy_reflect/src/attributes.rs | 1 - crates/bevy_reflect/src/enums/dynamic_enum.rs | 6 +- crates/bevy_reflect/src/enums/enum_trait.rs | 1 - crates/bevy_reflect/src/enums/mod.rs | 1 - crates/bevy_reflect/src/enums/variants.rs | 1 - .../bevy_reflect/src/func/dynamic_function.rs | 1 - crates/bevy_reflect/src/generics.rs | 1 - crates/bevy_reflect/src/impls/foldhash.rs | 2 +- crates/bevy_reflect/src/impls/glam.rs | 1 - crates/bevy_reflect/src/impls/petgraph.rs | 5 +- crates/bevy_reflect/src/impls/smallvec.rs | 8 +- crates/bevy_reflect/src/impls/smol_str.rs | 4 +- crates/bevy_reflect/src/impls/std.rs | 6 +- crates/bevy_reflect/src/impls/uuid.rs | 2 - crates/bevy_reflect/src/impls/wgpu_types.rs | 2 +- crates/bevy_reflect/src/lib.rs | 4 +- crates/bevy_reflect/src/list.rs | 6 +- crates/bevy_reflect/src/map.rs | 6 +- crates/bevy_reflect/src/path/mod.rs | 1 - crates/bevy_reflect/src/serde/de/mod.rs | 1 - crates/bevy_reflect/src/serde/mod.rs | 4 +- crates/bevy_reflect/src/serde/ser/mod.rs | 1 - crates/bevy_reflect/src/set.rs | 6 +- crates/bevy_reflect/src/struct_trait.rs | 2 - crates/bevy_reflect/src/tuple.rs | 8 +- crates/bevy_reflect/src/tuple_struct.rs | 2 - crates/bevy_reflect/src/type_registry.rs | 1 - crates/bevy_render/macros/src/lib.rs | 5 +- crates/bevy_render/src/lib.rs | 3 + .../src/render_resource/bind_group.rs | 1 - crates/bevy_state/src/app.rs | 1 - crates/bevy_state/src/condition.rs | 2 - crates/bevy_state/src/lib.rs | 3 + crates/bevy_state/src/reflect.rs | 1 - crates/bevy_state/src/state/mod.rs | 1 - tests-integration/remapped-test/Cargo.toml | 6 ++ tests-integration/remapped-test/src/lib.rs | 21 ++++ tests-integration/simple-ecs-test/Cargo.toml | 6 ++ tests-integration/simple-ecs-test/src/lib.rs | 36 +++++++ tools/ci/src/ci.rs | 13 +++ tools/ci/src/commands/compile.rs | 5 +- tools/ci/src/commands/integration_test.rs | 30 ++++++ .../ci/src/commands/integration_test_check.rs | 35 +++++++ .../ci/src/commands/integration_test_clean.rs | 24 +++++ tools/ci/src/commands/mod.rs | 6 ++ tools/ci/src/commands/test_check.rs | 2 +- 132 files changed, 325 insertions(+), 269 deletions(-) create mode 100644 tests-integration/remapped-test/Cargo.toml create mode 100644 tests-integration/remapped-test/src/lib.rs create mode 100644 tests-integration/simple-ecs-test/Cargo.toml create mode 100644 tests-integration/simple-ecs-test/src/lib.rs create mode 100644 tools/ci/src/commands/integration_test.rs create mode 100644 tools/ci/src/commands/integration_test_check.rs create mode 100644 tools/ci/src/commands/integration_test_clean.rs diff --git a/.gitignore b/.gitignore index d887b4e70797f..0d39edea49083 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ crates/**/target benches/**/target tools/**/target **/*.rs.bk +rustc-ice-*.txt # DX12 wgpu backend dxcompiler.dll diff --git a/Cargo.toml b/Cargo.toml index a5442ea926b54..a9ba376a727ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,10 @@ members = [ # Bevy's error codes. This is a crate so we can automatically check all of the code blocks. "errors", ] +exclude = [ + # Integration tests are not part of the workspace + "tests-integration", +] [workspace.lints.clippy] doc_markdown = "warn" @@ -494,6 +498,13 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" bytemuck = "1.7" bevy_render = { path = "crates/bevy_render", version = "0.16.0-dev", default-features = false } +# The following explicit dependencies are needed for proc macros to work inside of examples as they are part of the bevy crate itself. +bevy_ecs = { path = "crates/bevy_ecs", version = "0.16.0-dev", default-features = false } +bevy_state = { path = "crates/bevy_state", version = "0.16.0-dev", default-features = false } +bevy_asset = { path = "crates/bevy_asset", version = "0.16.0-dev", default-features = false } +bevy_reflect = { path = "crates/bevy_reflect", version = "0.16.0-dev", default-features = false } +bevy_image = { path = "crates/bevy_image", version = "0.16.0-dev", default-features = false } +bevy_gizmos = { path = "crates/bevy_gizmos", version = "0.16.0-dev", default-features = false } # Needed to poll Task examples futures-lite = "2.0.1" async-std = "1.13" diff --git a/benches/benches/bevy_ecs/change_detection.rs b/benches/benches/bevy_ecs/change_detection.rs index 8d49c2b8c7e1c..84a8d4c39e64a 100644 --- a/benches/benches/bevy_ecs/change_detection.rs +++ b/benches/benches/bevy_ecs/change_detection.rs @@ -267,7 +267,7 @@ fn none_changed_detection(criterion: &mut Criterion) { } } fn insert_if_bit_enabled(entity: &mut EntityWorldMut, i: u16) { - if i & 1 << B != 0 { + if i & (1 << B) != 0 { entity.insert(Data::(1.0)); } } diff --git a/benches/benches/bevy_ecs/components/archetype_updates.rs b/benches/benches/bevy_ecs/components/archetype_updates.rs index b11c5b2b7576e..2908332ea5e5f 100644 --- a/benches/benches/bevy_ecs/components/archetype_updates.rs +++ b/benches/benches/bevy_ecs/components/archetype_updates.rs @@ -22,7 +22,7 @@ fn setup(system_count: usize) -> (World, Schedule) { } fn insert_if_bit_enabled(entity: &mut EntityWorldMut, i: u16) { - if i & 1 << B != 0 { + if i & (1 << B) != 0 { entity.insert(A::(1.0)); } } diff --git a/benches/benches/bevy_ecs/empty_archetypes.rs b/benches/benches/bevy_ecs/empty_archetypes.rs index 91c2b5427a068..e5e7639066fe8 100644 --- a/benches/benches/bevy_ecs/empty_archetypes.rs +++ b/benches/benches/bevy_ecs/empty_archetypes.rs @@ -105,49 +105,49 @@ fn add_archetypes(world: &mut World, count: u16) { e.insert(A::<10>(1.0)); e.insert(A::<11>(1.0)); e.insert(A::<12>(1.0)); - if i & 1 << 1 != 0 { + if i & (1 << 1) != 0 { e.insert(A::<13>(1.0)); } - if i & 1 << 2 != 0 { + if i & (1 << 2) != 0 { e.insert(A::<14>(1.0)); } - if i & 1 << 3 != 0 { + if i & (1 << 3) != 0 { e.insert(A::<15>(1.0)); } - if i & 1 << 4 != 0 { + if i & (1 << 4) != 0 { e.insert(A::<16>(1.0)); } - if i & 1 << 5 != 0 { + if i & (1 << 5) != 0 { e.insert(A::<18>(1.0)); } - if i & 1 << 6 != 0 { + if i & (1 << 6) != 0 { e.insert(A::<19>(1.0)); } - if i & 1 << 7 != 0 { + if i & (1 << 7) != 0 { e.insert(A::<20>(1.0)); } - if i & 1 << 8 != 0 { + if i & (1 << 8) != 0 { e.insert(A::<21>(1.0)); } - if i & 1 << 9 != 0 { + if i & (1 << 9) != 0 { e.insert(A::<22>(1.0)); } - if i & 1 << 10 != 0 { + if i & (1 << 10) != 0 { e.insert(A::<23>(1.0)); } - if i & 1 << 11 != 0 { + if i & (1 << 11) != 0 { e.insert(A::<24>(1.0)); } - if i & 1 << 12 != 0 { + if i & (1 << 12) != 0 { e.insert(A::<25>(1.0)); } - if i & 1 << 13 != 0 { + if i & (1 << 13) != 0 { e.insert(A::<26>(1.0)); } - if i & 1 << 14 != 0 { + if i & (1 << 14) != 0 { e.insert(A::<27>(1.0)); } - if i & 1 << 15 != 0 { + if i & (1 << 15) != 0 { e.insert(A::<28>(1.0)); } } diff --git a/benches/benches/bevy_ecs/iteration/par_iter_simple.rs b/benches/benches/bevy_ecs/iteration/par_iter_simple.rs index dfd3f9dfdab0d..971598005ab1b 100644 --- a/benches/benches/bevy_ecs/iteration/par_iter_simple.rs +++ b/benches/benches/bevy_ecs/iteration/par_iter_simple.rs @@ -19,7 +19,7 @@ struct Data(f32); pub struct Benchmark<'w>(World, QueryState<(&'w Velocity, &'w mut Position)>); fn insert_if_bit_enabled(entity: &mut EntityWorldMut, i: u16) { - if i & 1 << B != 0 { + if i & (1 << B) != 0 { entity.insert(Data::(1.0)); } } diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index 11602ff5ad719..081e3e7ac0352 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -1532,7 +1532,6 @@ mod tests { #[test] fn test_derive_app_label() { use super::AppLabel; - use crate::{self as bevy_app}; #[derive(AppLabel, Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] struct UnitLabel; @@ -1664,7 +1663,6 @@ mod tests { #[test] fn test_extract_sees_changes() { use super::AppLabel; - use crate::{self as bevy_app}; #[derive(AppLabel, Clone, Copy, Hash, PartialEq, Eq, Debug)] struct MySubApp; diff --git a/crates/bevy_app/src/lib.rs b/crates/bevy_app/src/lib.rs index 13021924d033e..489b5415e30a3 100644 --- a/crates/bevy_app/src/lib.rs +++ b/crates/bevy_app/src/lib.rs @@ -20,6 +20,9 @@ extern crate std; extern crate alloc; +// Required to make proc macros work in bevy itself. +extern crate self as bevy_app; + mod app; mod main_schedule; mod panic_handler; diff --git a/crates/bevy_asset/src/asset_changed.rs b/crates/bevy_asset/src/asset_changed.rs index e9b5e974907b3..f11283f4882f9 100644 --- a/crates/bevy_asset/src/asset_changed.rs +++ b/crates/bevy_asset/src/asset_changed.rs @@ -282,7 +282,7 @@ unsafe impl QueryFilter for AssetChanged { #[cfg(test)] mod tests { - use crate::{self as bevy_asset, AssetEvents, AssetPlugin, Handle}; + use crate::{AssetEvents, AssetPlugin, Handle}; use alloc::{vec, vec::Vec}; use core::num::NonZero; use std::println; diff --git a/crates/bevy_asset/src/assets.rs b/crates/bevy_asset/src/assets.rs index e183b228cfa8a..f16feebdc1856 100644 --- a/crates/bevy_asset/src/assets.rs +++ b/crates/bevy_asset/src/assets.rs @@ -1,8 +1,5 @@ use crate::asset_changed::AssetChanges; -use crate::{ - self as bevy_asset, Asset, AssetEvent, AssetHandleProvider, AssetId, AssetServer, Handle, - UntypedHandle, -}; +use crate::{Asset, AssetEvent, AssetHandleProvider, AssetId, AssetServer, Handle, UntypedHandle}; use alloc::{sync::Arc, vec::Vec}; use bevy_ecs::{ prelude::EventWriter, diff --git a/crates/bevy_asset/src/folder.rs b/crates/bevy_asset/src/folder.rs index 58e7ef9a9d716..698b19d0c257f 100644 --- a/crates/bevy_asset/src/folder.rs +++ b/crates/bevy_asset/src/folder.rs @@ -1,6 +1,5 @@ use alloc::vec::Vec; -use crate as bevy_asset; use crate::{Asset, UntypedHandle}; use bevy_reflect::TypePath; diff --git a/crates/bevy_asset/src/lib.rs b/crates/bevy_asset/src/lib.rs index 8fb2a3da744fe..2328691904446 100644 --- a/crates/bevy_asset/src/lib.rs +++ b/crates/bevy_asset/src/lib.rs @@ -149,6 +149,9 @@ extern crate alloc; extern crate std; +// Required to make proc macros work in bevy itself. +extern crate self as bevy_asset; + pub mod io; pub mod meta; pub mod processor; @@ -627,7 +630,6 @@ pub struct AssetEvents; #[cfg(test)] mod tests { use crate::{ - self as bevy_asset, folder::LoadedFolder, handle::Handle, io::{ diff --git a/crates/bevy_asset/src/meta.rs b/crates/bevy_asset/src/meta.rs index 5217d193b2edb..0e972261198cc 100644 --- a/crates/bevy_asset/src/meta.rs +++ b/crates/bevy_asset/src/meta.rs @@ -5,8 +5,8 @@ use alloc::{ }; use crate::{ - self as bevy_asset, loader::AssetLoader, processor::Process, Asset, AssetPath, - DeserializeMetaError, VisitAssetDependencies, + loader::AssetLoader, processor::Process, Asset, AssetPath, DeserializeMetaError, + VisitAssetDependencies, }; use downcast_rs::{impl_downcast, Downcast}; use ron::ser::PrettyConfig; diff --git a/crates/bevy_asset/src/reflect.rs b/crates/bevy_asset/src/reflect.rs index 8347d19245b8f..5c436c10610f0 100644 --- a/crates/bevy_asset/src/reflect.rs +++ b/crates/bevy_asset/src/reflect.rs @@ -247,7 +247,6 @@ mod tests { use alloc::{string::String, vec::Vec}; use core::any::TypeId; - use crate as bevy_asset; use crate::{Asset, AssetApp, AssetPlugin, ReflectAsset, UntypedHandle}; use bevy_app::App; use bevy_ecs::reflect::AppTypeRegistry; diff --git a/crates/bevy_asset/src/server/loaders.rs b/crates/bevy_asset/src/server/loaders.rs index e0571c8fd6355..1250ff666ae9f 100644 --- a/crates/bevy_asset/src/server/loaders.rs +++ b/crates/bevy_asset/src/server/loaders.rs @@ -352,7 +352,7 @@ mod tests { use bevy_reflect::TypePath; use bevy_tasks::block_on; - use crate::{self as bevy_asset, Asset}; + use crate::Asset; use super::*; diff --git a/crates/bevy_ecs/src/bundle.rs b/crates/bevy_ecs/src/bundle.rs index c959488bbcdb6..1a33999cd58ec 100644 --- a/crates/bevy_ecs/src/bundle.rs +++ b/crates/bevy_ecs/src/bundle.rs @@ -1710,7 +1710,6 @@ fn sorted_remove(source: &mut Vec, remove: &[T]) { #[cfg(test)] mod tests { - use crate as bevy_ecs; use crate::{component::HookContext, prelude::*, world::DeferredWorld}; use alloc::vec; diff --git a/crates/bevy_ecs/src/change_detection.rs b/crates/bevy_ecs/src/change_detection.rs index 0884fbd59ebb3..7af159e5bd49f 100644 --- a/crates/bevy_ecs/src/change_detection.rs +++ b/crates/bevy_ecs/src/change_detection.rs @@ -1268,7 +1268,6 @@ mod tests { use core::panic::Location; use crate::{ - self as bevy_ecs, change_detection::{ Mut, NonSendMut, Ref, ResMut, TicksMut, CHECK_TICK_THRESHOLD, MAX_CHANGE_AGE, }, diff --git a/crates/bevy_ecs/src/component.rs b/crates/bevy_ecs/src/component.rs index 89e7788e01c0d..f8e1ee5a6925d 100644 --- a/crates/bevy_ecs/src/component.rs +++ b/crates/bevy_ecs/src/component.rs @@ -1,7 +1,6 @@ //! Types for declaring and storing [`Component`]s. use crate::{ - self as bevy_ecs, archetype::ArchetypeFlags, bundle::BundleInfo, change_detection::MAX_CHANGE_AGE, diff --git a/crates/bevy_ecs/src/entity/clone_entities.rs b/crates/bevy_ecs/src/entity/clone_entities.rs index 5ee0295bec424..389f30ff8d7b2 100644 --- a/crates/bevy_ecs/src/entity/clone_entities.rs +++ b/crates/bevy_ecs/src/entity/clone_entities.rs @@ -816,12 +816,11 @@ impl<'w> EntityClonerBuilder<'w> { mod tests { use super::ComponentCloneCtx; use crate::{ - self as bevy_ecs, component::{Component, ComponentCloneBehavior, ComponentDescriptor, StorageType}, entity::{hash_map::EntityHashMap, Entity, EntityCloner}, - hierarchy::{ChildOf, Children}, - reflect::{AppTypeRegistry, ReflectComponent, ReflectFromWorld}, - resource::Resource, + prelude::{ChildOf, Children, Resource}, + reflect::AppTypeRegistry, + reflect::{ReflectComponent, ReflectFromWorld}, system::Commands, world::{FromWorld, World}, }; @@ -835,6 +834,7 @@ mod tests { mod reflect { use super::*; use crate::{ + component::{Component, ComponentCloneBehavior}, entity::EntityCloner, reflect::{AppTypeRegistry, ReflectComponent, ReflectFromWorld}, system::Commands, diff --git a/crates/bevy_ecs/src/entity/entity_set.rs b/crates/bevy_ecs/src/entity/entity_set.rs index f75e59113932e..82ac75c163d32 100644 --- a/crates/bevy_ecs/src/entity/entity_set.rs +++ b/crates/bevy_ecs/src/entity/entity_set.rs @@ -470,7 +470,6 @@ mod tests { use crate::query::{QueryState, With}; use crate::system::Query; use crate::world::Mut; - use crate::{self as bevy_ecs}; use super::UniqueEntityIter; diff --git a/crates/bevy_ecs/src/entity/visit_entities.rs b/crates/bevy_ecs/src/entity/visit_entities.rs index 477216a4bcfef..734c96e1132b9 100644 --- a/crates/bevy_ecs/src/entity/visit_entities.rs +++ b/crates/bevy_ecs/src/entity/visit_entities.rs @@ -57,7 +57,6 @@ impl VisitEntitiesMut for Entity { #[cfg(test)] mod tests { use crate::{ - self as bevy_ecs, entity::{hash_map::EntityHashMap, MapEntities, SceneEntityMapper}, world::World, }; diff --git a/crates/bevy_ecs/src/entity_disabling.rs b/crates/bevy_ecs/src/entity_disabling.rs index f96c78c1632c9..77326cea3f8af 100644 --- a/crates/bevy_ecs/src/entity_disabling.rs +++ b/crates/bevy_ecs/src/entity_disabling.rs @@ -21,7 +21,6 @@ //! [`World`]: crate::prelude::World //! [`Query` performance]: crate::prelude::Query#performance -use crate as bevy_ecs; use crate::{ component::{ComponentId, Components, StorageType}, query::FilteredAccess, diff --git a/crates/bevy_ecs/src/event/base.rs b/crates/bevy_ecs/src/event/base.rs index b9f7ec8d05579..2b5c0905044ab 100644 --- a/crates/bevy_ecs/src/event/base.rs +++ b/crates/bevy_ecs/src/event/base.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; use crate::component::ComponentId; use crate::world::World; use crate::{component::Component, traversal::Traversal}; diff --git a/crates/bevy_ecs/src/event/collections.rs b/crates/bevy_ecs/src/event/collections.rs index 77573d2151b25..a62dcfb30c958 100644 --- a/crates/bevy_ecs/src/event/collections.rs +++ b/crates/bevy_ecs/src/event/collections.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; use alloc::vec::Vec; use bevy_ecs::{ event::{Event, EventCursor, EventId, EventInstance}, @@ -398,7 +397,7 @@ impl ExactSizeIterator for SendBatchIds { #[cfg(test)] mod tests { - use crate::{self as bevy_ecs, event::Events}; + use crate::event::Events; use bevy_ecs_macros::Event; #[test] diff --git a/crates/bevy_ecs/src/event/event_cursor.rs b/crates/bevy_ecs/src/event/event_cursor.rs index 262d4e3636adc..ff15ef4931581 100644 --- a/crates/bevy_ecs/src/event/event_cursor.rs +++ b/crates/bevy_ecs/src/event/event_cursor.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; use bevy_ecs::event::{ Event, EventIterator, EventIteratorWithId, EventMutIterator, EventMutIteratorWithId, Events, }; diff --git a/crates/bevy_ecs/src/event/iterators.rs b/crates/bevy_ecs/src/event/iterators.rs index b2f9421aa7d0c..f9ee74b8b08d9 100644 --- a/crates/bevy_ecs/src/event/iterators.rs +++ b/crates/bevy_ecs/src/event/iterators.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; #[cfg(feature = "multi_threaded")] use bevy_ecs::batching::BatchingStrategy; use bevy_ecs::event::{Event, EventCursor, EventId, EventInstance, Events}; diff --git a/crates/bevy_ecs/src/event/mod.rs b/crates/bevy_ecs/src/event/mod.rs index c8bd24dcdde5f..9c19dc16895e7 100644 --- a/crates/bevy_ecs/src/event/mod.rs +++ b/crates/bevy_ecs/src/event/mod.rs @@ -31,7 +31,6 @@ pub use writer::EventWriter; #[cfg(test)] mod tests { - use crate as bevy_ecs; use alloc::{vec, vec::Vec}; use bevy_ecs::{event::*, system::assert_is_read_only_system}; use bevy_ecs_macros::Event; diff --git a/crates/bevy_ecs/src/event/mut_iterators.rs b/crates/bevy_ecs/src/event/mut_iterators.rs index f1434db062583..3cb531ce78829 100644 --- a/crates/bevy_ecs/src/event/mut_iterators.rs +++ b/crates/bevy_ecs/src/event/mut_iterators.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; #[cfg(feature = "multi_threaded")] use bevy_ecs::batching::BatchingStrategy; use bevy_ecs::event::{Event, EventCursor, EventId, EventInstance, Events}; diff --git a/crates/bevy_ecs/src/event/mutator.rs b/crates/bevy_ecs/src/event/mutator.rs index ee77f9961a3b4..0afbeaa00d896 100644 --- a/crates/bevy_ecs/src/event/mutator.rs +++ b/crates/bevy_ecs/src/event/mutator.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; #[cfg(feature = "multi_threaded")] use bevy_ecs::event::EventMutParIter; use bevy_ecs::{ diff --git a/crates/bevy_ecs/src/event/reader.rs b/crates/bevy_ecs/src/event/reader.rs index 1611fa6ba5ffc..bc0f4f86bcc99 100644 --- a/crates/bevy_ecs/src/event/reader.rs +++ b/crates/bevy_ecs/src/event/reader.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; #[cfg(feature = "multi_threaded")] use bevy_ecs::event::EventParIter; use bevy_ecs::{ diff --git a/crates/bevy_ecs/src/event/registry.rs b/crates/bevy_ecs/src/event/registry.rs index 070f08f846328..231f792f68392 100644 --- a/crates/bevy_ecs/src/event/registry.rs +++ b/crates/bevy_ecs/src/event/registry.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; use alloc::vec::Vec; use bevy_ecs::{ change_detection::{DetectChangesMut, MutUntyped}, diff --git a/crates/bevy_ecs/src/event/update.rs b/crates/bevy_ecs/src/event/update.rs index bf3c07de4d3c8..c7b43aef00689 100644 --- a/crates/bevy_ecs/src/event/update.rs +++ b/crates/bevy_ecs/src/event/update.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; use bevy_ecs::{ change_detection::Mut, component::Tick, diff --git a/crates/bevy_ecs/src/event/writer.rs b/crates/bevy_ecs/src/event/writer.rs index f391e7c3449da..ebdedce1776b4 100644 --- a/crates/bevy_ecs/src/event/writer.rs +++ b/crates/bevy_ecs/src/event/writer.rs @@ -1,4 +1,3 @@ -use crate as bevy_ecs; use bevy_ecs::{ event::{Event, EventId, Events, SendBatchIds}, system::{ResMut, SystemParam}, diff --git a/crates/bevy_ecs/src/hierarchy.rs b/crates/bevy_ecs/src/hierarchy.rs index b4ed612a1d70e..2f34a2e504b1b 100644 --- a/crates/bevy_ecs/src/hierarchy.rs +++ b/crates/bevy_ecs/src/hierarchy.rs @@ -9,7 +9,6 @@ #[cfg(feature = "bevy_reflect")] use crate::reflect::{ReflectComponent, ReflectFromWorld}; use crate::{ - self as bevy_ecs, bundle::Bundle, component::{Component, HookContext}, entity::Entity, diff --git a/crates/bevy_ecs/src/identifier/mod.rs b/crates/bevy_ecs/src/identifier/mod.rs index cf467da505dfc..964f03ed3a856 100644 --- a/crates/bevy_ecs/src/identifier/mod.rs +++ b/crates/bevy_ecs/src/identifier/mod.rs @@ -201,7 +201,7 @@ mod tests { // and also Entity flag. let high = 0x7FFFFFFF; let low = 0xC; - let bits: u64 = high << u32::BITS | low; + let bits: u64 = (high << u32::BITS) | low; let id = Identifier::try_from_bits(bits).unwrap(); diff --git a/crates/bevy_ecs/src/lib.rs b/crates/bevy_ecs/src/lib.rs index 57d173b975ddd..299ffe7b76542 100644 --- a/crates/bevy_ecs/src/lib.rs +++ b/crates/bevy_ecs/src/lib.rs @@ -33,6 +33,9 @@ compile_error!("bevy_ecs cannot safely compile for a 16-bit platform."); extern crate alloc; +// Required to make proc macros work in bevy itself. +extern crate self as bevy_ecs; + pub mod archetype; pub mod batching; pub mod bundle; @@ -128,7 +131,6 @@ pub mod __macro_exports { #[cfg(test)] mod tests { - use crate as bevy_ecs; use crate::{ bundle::Bundle, change_detection::Ref, diff --git a/crates/bevy_ecs/src/name.rs b/crates/bevy_ecs/src/name.rs index c5557bc409cf8..9c38b28481e7f 100644 --- a/crates/bevy_ecs/src/name.rs +++ b/crates/bevy_ecs/src/name.rs @@ -1,6 +1,6 @@ //! Provides the [`Name`] [`Component`], used for identifying an [`Entity`]. -use crate::{self as bevy_ecs, component::Component, entity::Entity, query::QueryData}; +use crate::{component::Component, entity::Entity, query::QueryData}; use alloc::{ borrow::{Cow, ToOwned}, diff --git a/crates/bevy_ecs/src/observer/entity_observer.rs b/crates/bevy_ecs/src/observer/entity_observer.rs index 893bd3d4917d0..556ca0d8aa523 100644 --- a/crates/bevy_ecs/src/observer/entity_observer.rs +++ b/crates/bevy_ecs/src/observer/entity_observer.rs @@ -110,8 +110,8 @@ fn component_clone_observed_by(commands: &mut Commands, ctx: &mut ComponentClone #[cfg(test)] mod tests { use crate::{ - self as bevy_ecs, entity::EntityCloner, event::Event, observer::Trigger, - resource::Resource, system::ResMut, world::World, + entity::EntityCloner, event::Event, observer::Trigger, resource::Resource, system::ResMut, + world::World, }; #[derive(Resource, Default)] diff --git a/crates/bevy_ecs/src/observer/mod.rs b/crates/bevy_ecs/src/observer/mod.rs index 82eb260cb4936..8c22ace911f2c 100644 --- a/crates/bevy_ecs/src/observer/mod.rs +++ b/crates/bevy_ecs/src/observer/mod.rs @@ -864,7 +864,6 @@ mod tests { use bevy_platform_support::collections::HashMap; use bevy_ptr::OwningPtr; - use crate as bevy_ecs; use crate::component::ComponentId; use crate::{ observer::{Observer, ObserverDescriptor, ObserverState, OnReplace}, diff --git a/crates/bevy_ecs/src/query/builder.rs b/crates/bevy_ecs/src/query/builder.rs index d699cb3aea4ac..65ad02111cad8 100644 --- a/crates/bevy_ecs/src/query/builder.rs +++ b/crates/bevy_ecs/src/query/builder.rs @@ -275,7 +275,6 @@ impl<'w, D: QueryData, F: QueryFilter> QueryBuilder<'w, D, F> { #[cfg(test)] mod tests { - use crate as bevy_ecs; use crate::{prelude::*, world::FilteredEntityRef}; use std::dbg; diff --git a/crates/bevy_ecs/src/query/error.rs b/crates/bevy_ecs/src/query/error.rs index 2031f390009cc..054da37a75747 100644 --- a/crates/bevy_ecs/src/query/error.rs +++ b/crates/bevy_ecs/src/query/error.rs @@ -111,7 +111,6 @@ pub enum QuerySingleError { #[cfg(test)] mod test { - use crate as bevy_ecs; use crate::prelude::World; use alloc::format; use bevy_ecs_macros::Component; diff --git a/crates/bevy_ecs/src/query/fetch.rs b/crates/bevy_ecs/src/query/fetch.rs index 627bebd065b05..bf9b41e1d43d6 100644 --- a/crates/bevy_ecs/src/query/fetch.rs +++ b/crates/bevy_ecs/src/query/fetch.rs @@ -2481,10 +2481,7 @@ mod tests { use bevy_ecs_macros::QueryData; use super::*; - use crate::{ - self as bevy_ecs, - system::{assert_is_system, Query}, - }; + use crate::system::{assert_is_system, Query}; #[derive(Component)] pub struct A; diff --git a/crates/bevy_ecs/src/query/iter.rs b/crates/bevy_ecs/src/query/iter.rs index cd91b38f2126d..f68b9d45d168b 100644 --- a/crates/bevy_ecs/src/query/iter.rs +++ b/crates/bevy_ecs/src/query/iter.rs @@ -1309,7 +1309,7 @@ impl<'w, 's, D: QueryData, F: QueryFilter, I: Iterator> /// // We need to collect the internal iterator before iterating mutably /// let mut parent_query_iter = query.iter_many_mut(entity_list) /// .sort::(); - /// + /// /// let mut scratch_value = 0; /// while let Some(mut part_value) = parent_query_iter.fetch_next_back() /// { @@ -2582,7 +2582,6 @@ mod tests { use crate::component::Component; use crate::entity::Entity; use crate::prelude::World; - use crate::{self as bevy_ecs}; #[derive(Component, Debug, PartialEq, PartialOrd, Clone, Copy)] struct A(f32); diff --git a/crates/bevy_ecs/src/query/mod.rs b/crates/bevy_ecs/src/query/mod.rs index 5e5574381ca54..9d40dd7d01f30 100644 --- a/crates/bevy_ecs/src/query/mod.rs +++ b/crates/bevy_ecs/src/query/mod.rs @@ -104,7 +104,6 @@ impl DebugCheckedUnwrap for Option { #[cfg(test)] mod tests { use crate::{ - self as bevy_ecs, archetype::Archetype, component::{Component, ComponentId, Components, Tick}, prelude::{AnyOf, Changed, Entity, Or, QueryState, Res, ResMut, Resource, With, Without}, diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index 01fe7845656aa..0019fe378376b 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -2010,7 +2010,6 @@ impl From> for QueryState( #[cfg(test)] mod tests { - use crate as bevy_ecs; use crate::world::World; use crate::{component::Component, entity::Entity}; use alloc::vec::Vec; diff --git a/crates/bevy_ecs/src/relationship/related_methods.rs b/crates/bevy_ecs/src/relationship/related_methods.rs index ea8bfb979fd77..150bd02ebdbe6 100644 --- a/crates/bevy_ecs/src/relationship/related_methods.rs +++ b/crates/bevy_ecs/src/relationship/related_methods.rs @@ -249,7 +249,6 @@ impl<'w, R: Relationship> RelatedSpawnerCommands<'w, R> { #[cfg(test)] mod tests { use super::*; - use crate as bevy_ecs; use crate::prelude::{ChildOf, Children, Component}; #[derive(Component, Clone, Copy)] diff --git a/crates/bevy_ecs/src/relationship/relationship_source_collection.rs b/crates/bevy_ecs/src/relationship/relationship_source_collection.rs index 7894452e9f3e7..013cdd63aaf2b 100644 --- a/crates/bevy_ecs/src/relationship/relationship_source_collection.rs +++ b/crates/bevy_ecs/src/relationship/relationship_source_collection.rs @@ -119,7 +119,6 @@ impl RelationshipSourceCollection for SmallVec<[Entity; N]> { #[cfg(test)] mod tests { use super::*; - use crate as bevy_ecs; use crate::prelude::{Component, World}; use crate::relationship::RelationshipTarget; diff --git a/crates/bevy_ecs/src/removal_detection.rs b/crates/bevy_ecs/src/removal_detection.rs index c81a5cfa1eb2c..a1480a1923144 100644 --- a/crates/bevy_ecs/src/removal_detection.rs +++ b/crates/bevy_ecs/src/removal_detection.rs @@ -1,7 +1,6 @@ //! Alerting events when a component is removed from an entity. use crate::{ - self as bevy_ecs, component::{Component, ComponentId, ComponentIdFor, Tick}, entity::Entity, event::{Event, EventCursor, EventId, EventIterator, EventIteratorWithId, Events}, diff --git a/crates/bevy_ecs/src/schedule/condition.rs b/crates/bevy_ecs/src/schedule/condition.rs index f80a0ad086aed..1bd0e9f4da304 100644 --- a/crates/bevy_ecs/src/schedule/condition.rs +++ b/crates/bevy_ecs/src/schedule/condition.rs @@ -1263,7 +1263,6 @@ where #[cfg(test)] mod tests { use super::{common_conditions::*, Condition}; - use crate as bevy_ecs; use crate::query::With; use crate::{ change_detection::ResMut, diff --git a/crates/bevy_ecs/src/schedule/executor/mod.rs b/crates/bevy_ecs/src/schedule/executor/mod.rs index 8b549a15ea6d3..fc9b50e700f6b 100644 --- a/crates/bevy_ecs/src/schedule/executor/mod.rs +++ b/crates/bevy_ecs/src/schedule/executor/mod.rs @@ -311,7 +311,6 @@ mod __rust_begin_short_backtrace { #[cfg(test)] mod tests { use crate::{ - self as bevy_ecs, prelude::{IntoSystemConfigs, IntoSystemSetConfigs, Resource, Schedule, SystemSet}, schedule::ExecutorKind, system::{Commands, Res, WithParamWarnPolicy}, diff --git a/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs b/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs index cfa3dc8398431..2580207db256a 100644 --- a/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs +++ b/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs @@ -22,8 +22,6 @@ use crate::{ world::{unsafe_world_cell::UnsafeWorldCell, World}, }; -use crate as bevy_ecs; - use super::__rust_begin_short_backtrace; /// Borrowed data used by the [`MultiThreadedExecutor`]. @@ -796,7 +794,6 @@ impl MainThreadExecutor { #[cfg(test)] mod tests { use crate::{ - self as bevy_ecs, prelude::Resource, schedule::{ExecutorKind, IntoSystemConfigs, Schedule}, system::Commands, diff --git a/crates/bevy_ecs/src/schedule/mod.rs b/crates/bevy_ecs/src/schedule/mod.rs index f69287745c532..eb48b2c4fe342 100644 --- a/crates/bevy_ecs/src/schedule/mod.rs +++ b/crates/bevy_ecs/src/schedule/mod.rs @@ -29,7 +29,6 @@ mod tests { use alloc::{string::ToString, vec, vec::Vec}; use core::sync::atomic::{AtomicU32, Ordering}; - pub use crate as bevy_ecs; pub use crate::{ prelude::World, resource::Resource, @@ -730,8 +729,6 @@ mod tests { use alloc::collections::BTreeSet; use super::*; - // Required to make the derive macro behave - use crate as bevy_ecs; use crate::prelude::*; #[derive(Resource)] diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index 8c73d7cfe39f6..890263ca2357d 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -25,7 +25,6 @@ use thiserror::Error; use tracing::info_span; use crate::{ - self as bevy_ecs, component::{ComponentId, Components, Tick}, prelude::Component, resource::Resource, @@ -2020,7 +2019,6 @@ mod tests { use bevy_ecs_macros::ScheduleLabel; use crate::{ - self as bevy_ecs, prelude::{Res, Resource}, schedule::{ tests::ResMut, IntoSystemConfigs, IntoSystemSetConfigs, Schedule, diff --git a/crates/bevy_ecs/src/schedule/set.rs b/crates/bevy_ecs/src/schedule/set.rs index 010e9b5303848..896c7ed050ecc 100644 --- a/crates/bevy_ecs/src/schedule/set.rs +++ b/crates/bevy_ecs/src/schedule/set.rs @@ -225,7 +225,7 @@ mod tests { #[test] fn test_schedule_label() { - use crate::{self as bevy_ecs, world::World}; + use crate::world::World; #[derive(Resource)] struct Flag(bool); @@ -257,8 +257,6 @@ mod tests { #[test] fn test_derive_schedule_label() { - use crate::{self as bevy_ecs}; - #[derive(ScheduleLabel, Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] struct UnitLabel; @@ -359,8 +357,6 @@ mod tests { #[test] fn test_derive_system_set() { - use crate::{self as bevy_ecs}; - #[derive(SystemSet, Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] struct UnitSet; diff --git a/crates/bevy_ecs/src/schedule/stepping.rs b/crates/bevy_ecs/src/schedule/stepping.rs index 2ba41c60b8cd5..f26da4cad370a 100644 --- a/crates/bevy_ecs/src/schedule/stepping.rs +++ b/crates/bevy_ecs/src/schedule/stepping.rs @@ -17,8 +17,6 @@ use log::error; #[cfg(test)] use log::debug; -use crate as bevy_ecs; - #[derive(Debug, Default, PartialEq, Eq, Copy, Clone)] enum Action { /// Stepping is disabled; run all systems @@ -831,8 +829,6 @@ mod tests { use alloc::{format, vec}; use std::println; - pub use crate as bevy_ecs; - #[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash)] struct TestSchedule; diff --git a/crates/bevy_ecs/src/storage/blob_array.rs b/crates/bevy_ecs/src/storage/blob_array.rs index 86315386a8d1f..911efde621b36 100644 --- a/crates/bevy_ecs/src/storage/blob_array.rs +++ b/crates/bevy_ecs/src/storage/blob_array.rs @@ -479,7 +479,6 @@ impl BlobArray { #[cfg(test)] mod tests { - use crate as bevy_ecs; use bevy_ecs::prelude::*; #[derive(Component)] diff --git a/crates/bevy_ecs/src/storage/blob_vec.rs b/crates/bevy_ecs/src/storage/blob_vec.rs index 51a3d49e3c08d..971cf80fa7820 100644 --- a/crates/bevy_ecs/src/storage/blob_vec.rs +++ b/crates/bevy_ecs/src/storage/blob_vec.rs @@ -498,7 +498,6 @@ const fn padding_needed_for(layout: &Layout, align: usize) -> usize { #[cfg(test)] mod tests { use super::BlobVec; - use crate as bevy_ecs; // required for derive macros use crate::{component::Component, ptr::OwningPtr, world::World}; use alloc::{ rc::Rc, diff --git a/crates/bevy_ecs/src/storage/sparse_set.rs b/crates/bevy_ecs/src/storage/sparse_set.rs index c55d00245f671..d6ea6c59ece1d 100644 --- a/crates/bevy_ecs/src/storage/sparse_set.rs +++ b/crates/bevy_ecs/src/storage/sparse_set.rs @@ -661,7 +661,6 @@ impl SparseSets { mod tests { use super::SparseSets; use crate::{ - self as bevy_ecs, component::{Component, ComponentDescriptor, ComponentId, ComponentInfo}, entity::Entity, storage::SparseSet, diff --git a/crates/bevy_ecs/src/storage/table/mod.rs b/crates/bevy_ecs/src/storage/table/mod.rs index 9f005e8c82b96..4a9d7951284ea 100644 --- a/crates/bevy_ecs/src/storage/table/mod.rs +++ b/crates/bevy_ecs/src/storage/table/mod.rs @@ -815,7 +815,6 @@ impl Drop for Table { #[cfg(test)] mod tests { - use crate as bevy_ecs; use crate::{ component::{Component, Components, Tick}, entity::Entity, diff --git a/crates/bevy_ecs/src/system/builder.rs b/crates/bevy_ecs/src/system/builder.rs index c7605764e98f7..a5556f123b516 100644 --- a/crates/bevy_ecs/src/system/builder.rs +++ b/crates/bevy_ecs/src/system/builder.rs @@ -712,7 +712,6 @@ unsafe impl<'w, 's, T: FnOnce(&mut FilteredResourcesMutBuilder)> #[cfg(test)] mod tests { - use crate as bevy_ecs; use crate::{ entity::Entities, prelude::{Component, Query}, diff --git a/crates/bevy_ecs/src/system/commands/mod.rs b/crates/bevy_ecs/src/system/commands/mod.rs index 5f4fb1976d445..180939f514988 100644 --- a/crates/bevy_ecs/src/system/commands/mod.rs +++ b/crates/bevy_ecs/src/system/commands/mod.rs @@ -17,7 +17,6 @@ use core::panic::Location; use log::error; use crate::{ - self as bevy_ecs, bundle::{Bundle, InsertMode}, change_detection::Mut, component::{Component, ComponentId, Mutable}, @@ -2203,7 +2202,6 @@ impl<'a, T: Component> EntityEntryCommands<'a, T> { #[cfg(test)] mod tests { use crate::{ - self as bevy_ecs, component::{require, Component}, resource::Resource, system::Commands, diff --git a/crates/bevy_ecs/src/system/commands/parallel_scope.rs b/crates/bevy_ecs/src/system/commands/parallel_scope.rs index 82a00ceac2977..2f471c13c5449 100644 --- a/crates/bevy_ecs/src/system/commands/parallel_scope.rs +++ b/crates/bevy_ecs/src/system/commands/parallel_scope.rs @@ -1,7 +1,6 @@ use bevy_utils::Parallel; use crate::{ - self as bevy_ecs, entity::Entities, prelude::World, system::{Deferred, SystemBuffer, SystemMeta, SystemParam}, diff --git a/crates/bevy_ecs/src/system/exclusive_system_param.rs b/crates/bevy_ecs/src/system/exclusive_system_param.rs index e36b7ea759bdd..f271e32e2f714 100644 --- a/crates/bevy_ecs/src/system/exclusive_system_param.rs +++ b/crates/bevy_ecs/src/system/exclusive_system_param.rs @@ -136,7 +136,6 @@ all_tuples!( #[cfg(test)] mod tests { - use crate as bevy_ecs; use crate::{schedule::Schedule, system::Local, world::World}; use alloc::vec::Vec; use bevy_ecs_macros::Resource; diff --git a/crates/bevy_ecs/src/system/mod.rs b/crates/bevy_ecs/src/system/mod.rs index 04594f06e244d..4fe489d253d1e 100644 --- a/crates/bevy_ecs/src/system/mod.rs +++ b/crates/bevy_ecs/src/system/mod.rs @@ -330,7 +330,6 @@ mod tests { use std::println; use crate::{ - self as bevy_ecs, archetype::{ArchetypeComponentId, Archetypes}, bundle::Bundles, change_detection::DetectChanges, diff --git a/crates/bevy_ecs/src/system/observer_system.rs b/crates/bevy_ecs/src/system/observer_system.rs index fa4f6035b8884..5dca4f4497678 100644 --- a/crates/bevy_ecs/src/system/observer_system.rs +++ b/crates/bevy_ecs/src/system/observer_system.rs @@ -60,7 +60,6 @@ where #[cfg(test)] mod tests { use crate::{ - self as bevy_ecs, event::Event, observer::Trigger, system::{In, IntoSystem}, diff --git a/crates/bevy_ecs/src/system/system.rs b/crates/bevy_ecs/src/system/system.rs index 4f22340bff8cc..d0990e907f8ec 100644 --- a/crates/bevy_ecs/src/system/system.rs +++ b/crates/bevy_ecs/src/system/system.rs @@ -381,7 +381,6 @@ impl Debug for RunSystemError { #[cfg(test)] mod tests { use super::*; - use crate as bevy_ecs; use crate::prelude::*; #[test] diff --git a/crates/bevy_ecs/src/system/system_param.rs b/crates/bevy_ecs/src/system/system_param.rs index 0fb2fcf54e46d..b892748b52de5 100644 --- a/crates/bevy_ecs/src/system/system_param.rs +++ b/crates/bevy_ecs/src/system/system_param.rs @@ -2582,10 +2582,7 @@ unsafe impl SystemParam for FilteredResourcesMut<'_, '_> { #[cfg(test)] mod tests { use super::*; - use crate::{ - self as bevy_ecs, // Necessary for the `SystemParam` Derive when used inside `bevy_ecs`. - system::assert_is_system, - }; + use crate::system::assert_is_system; use core::cell::RefCell; // Compile test for https://github.com/bevyengine/bevy/pull/2838. diff --git a/crates/bevy_ecs/src/system/system_registry.rs b/crates/bevy_ecs/src/system/system_registry.rs index 2a85afd12adad..2d849dda95666 100644 --- a/crates/bevy_ecs/src/system/system_registry.rs +++ b/crates/bevy_ecs/src/system/system_registry.rs @@ -1,7 +1,6 @@ #[cfg(feature = "bevy_reflect")] use crate::reflect::ReflectComponent; use crate::{ - self as bevy_ecs, change_detection::Mut, entity::Entity, system::{input::SystemInput, BoxedSystem, IntoSystem, System}, @@ -498,7 +497,6 @@ impl core::fmt::Debug for RegisteredSystemError { mod tests { use crate::prelude::*; - use crate::{self as bevy_ecs}; #[derive(Resource, Default, PartialEq, Debug)] struct Counter(u8); diff --git a/crates/bevy_ecs/src/world/command_queue.rs b/crates/bevy_ecs/src/world/command_queue.rs index f1563643fcc8c..e8f820c0661f4 100644 --- a/crates/bevy_ecs/src/world/command_queue.rs +++ b/crates/bevy_ecs/src/world/command_queue.rs @@ -335,7 +335,7 @@ impl SystemBuffer for CommandQueue { #[cfg(test)] mod test { use super::*; - use crate::{self as bevy_ecs, resource::Resource}; + use crate::resource::Resource; use alloc::{borrow::ToOwned, string::String, sync::Arc}; use core::{ panic::AssertUnwindSafe, diff --git a/crates/bevy_ecs/src/world/component_constants.rs b/crates/bevy_ecs/src/world/component_constants.rs index 2be76b1fc0f90..ea2899c5f916a 100644 --- a/crates/bevy_ecs/src/world/component_constants.rs +++ b/crates/bevy_ecs/src/world/component_constants.rs @@ -1,7 +1,6 @@ //! Internal components used by bevy with a fixed component id. //! Constants are used to skip [`TypeId`] lookups in hot paths. use super::*; -use crate::{self as bevy_ecs}; #[cfg(feature = "bevy_reflect")] use bevy_reflect::Reflect; diff --git a/crates/bevy_ecs/src/world/entity_ref.rs b/crates/bevy_ecs/src/world/entity_ref.rs index a6cab26fd6774..5e9add0d81878 100644 --- a/crates/bevy_ecs/src/world/entity_ref.rs +++ b/crates/bevy_ecs/src/world/entity_ref.rs @@ -4417,7 +4417,6 @@ mod tests { use crate::component::HookContext; use crate::{ - self as bevy_ecs, change_detection::MutUntyped, component::ComponentId, prelude::*, diff --git a/crates/bevy_ecs/src/world/mod.rs b/crates/bevy_ecs/src/world/mod.rs index b7ecf5b6f3312..28ef6a6e5a6ca 100644 --- a/crates/bevy_ecs/src/world/mod.rs +++ b/crates/bevy_ecs/src/world/mod.rs @@ -3763,9 +3763,6 @@ mod tests { }; use std::{println, sync::Mutex}; - // For bevy_ecs_macros - use crate as bevy_ecs; - type ID = u8; #[derive(Clone, Copy, Debug, PartialEq, Eq)] diff --git a/crates/bevy_ecs/src/world/reflect.rs b/crates/bevy_ecs/src/world/reflect.rs index 882cf9b74a78a..4337416aa2dc9 100644 --- a/crates/bevy_ecs/src/world/reflect.rs +++ b/crates/bevy_ecs/src/world/reflect.rs @@ -251,11 +251,7 @@ mod tests { use bevy_reflect::Reflect; - use crate::{ - // For bevy_ecs_macros - self as bevy_ecs, - prelude::{AppTypeRegistry, Component, DetectChanges, World}, - }; + use crate::prelude::{AppTypeRegistry, Component, DetectChanges, World}; #[derive(Component, Reflect)] struct RFoo(i32); diff --git a/crates/bevy_ecs/src/world/unsafe_world_cell.rs b/crates/bevy_ecs/src/world/unsafe_world_cell.rs index 8486ee950cc07..5ad2a3504e38b 100644 --- a/crates/bevy_ecs/src/world/unsafe_world_cell.rs +++ b/crates/bevy_ecs/src/world/unsafe_world_cell.rs @@ -1222,7 +1222,6 @@ impl EntityBorrow for UnsafeEntityCell<'_> { #[cfg(test)] mod tests { use super::*; - use crate as bevy_ecs; #[test] #[should_panic = "is forbidden"] diff --git a/crates/bevy_encase_derive/src/lib.rs b/crates/bevy_encase_derive/src/lib.rs index 0432d161f0a6b..eccfcdd01df52 100644 --- a/crates/bevy_encase_derive/src/lib.rs +++ b/crates/bevy_encase_derive/src/lib.rs @@ -31,7 +31,7 @@ fn bevy_encase_path() -> syn::Path { segments, } }) - .unwrap_or_else(|| bevy_manifest.get_path(ENCASE)) + .unwrap_or_else(|_err| bevy_manifest.get_path(ENCASE)) } implement!(bevy_encase_path()); diff --git a/crates/bevy_gizmos/src/aabb.rs b/crates/bevy_gizmos/src/aabb.rs index b10b2bc946966..605a4c2e88c6a 100644 --- a/crates/bevy_gizmos/src/aabb.rs +++ b/crates/bevy_gizmos/src/aabb.rs @@ -1,7 +1,5 @@ //! A module adding debug visualization of [`Aabb`]s. -use crate as bevy_gizmos; - use bevy_app::{Plugin, PostUpdate}; use bevy_color::{Color, Oklcha}; use bevy_ecs::{ diff --git a/crates/bevy_gizmos/src/config.rs b/crates/bevy_gizmos/src/config.rs index a7e60088b6d7b..bba3ff284cb2e 100644 --- a/crates/bevy_gizmos/src/config.rs +++ b/crates/bevy_gizmos/src/config.rs @@ -1,6 +1,5 @@ //! A module for the [`GizmoConfig`] [`Resource`]. -use crate::{self as bevy_gizmos}; pub use bevy_gizmos_macros::GizmoConfigGroup; #[cfg(all( diff --git a/crates/bevy_gizmos/src/lib.rs b/crates/bevy_gizmos/src/lib.rs index 42e32e6b0be8e..fdc2243233916 100644 --- a/crates/bevy_gizmos/src/lib.rs +++ b/crates/bevy_gizmos/src/lib.rs @@ -19,6 +19,9 @@ //! //! See the documentation on [Gizmos](crate::gizmos::Gizmos) for more examples. +// Required to make proc macros work in bevy itself. +extern crate self as bevy_gizmos; + /// System set label for the systems handling the rendering of gizmos. #[derive(SystemSet, Clone, Debug, Hash, PartialEq, Eq)] pub enum GizmoRenderSystem { diff --git a/crates/bevy_gizmos/src/light.rs b/crates/bevy_gizmos/src/light.rs index 9a618ac85acc7..d6df0b7d3bb20 100644 --- a/crates/bevy_gizmos/src/light.rs +++ b/crates/bevy_gizmos/src/light.rs @@ -2,7 +2,7 @@ use core::f32::consts::PI; -use crate::{self as bevy_gizmos, primitives::dim3::GizmoPrimitive3d}; +use crate::primitives::dim3::GizmoPrimitive3d; use bevy_app::{Plugin, PostUpdate}; use bevy_color::{ diff --git a/crates/bevy_macro_utils/Cargo.toml b/crates/bevy_macro_utils/Cargo.toml index 91f68913f6dd8..28ee17c871cd8 100644 --- a/crates/bevy_macro_utils/Cargo.toml +++ b/crates/bevy_macro_utils/Cargo.toml @@ -9,12 +9,10 @@ license = "MIT OR Apache-2.0" keywords = ["bevy"] [dependencies] -toml_edit = { version = "0.22.7", default-features = false, features = [ - "parse", -] } syn = "2.0" quote = "1.0" proc-macro2 = "1.0" +cargo-manifest-proc-macros = "0.3.3" [lints] workspace = true diff --git a/crates/bevy_macro_utils/src/bevy_manifest.rs b/crates/bevy_macro_utils/src/bevy_manifest.rs index 2185f09252d0f..5a492f8a81f61 100644 --- a/crates/bevy_macro_utils/src/bevy_manifest.rs +++ b/crates/bevy_macro_utils/src/bevy_manifest.rs @@ -1,83 +1,55 @@ extern crate proc_macro; +use std::sync::MutexGuard; + +use cargo_manifest_proc_macros::{ + CargoManifest, CrateReExportingPolicy, KnownReExportingCrate, PathPiece, + TryResolveCratePathError, +}; use proc_macro::TokenStream; -use std::{env, path::PathBuf, sync::LazyLock}; -use toml_edit::{DocumentMut, Item}; -/// The path to the `Cargo.toml` file for the Bevy project. -pub struct BevyManifest { - manifest: DocumentMut, +struct BevyReExportingPolicy; + +impl CrateReExportingPolicy for BevyReExportingPolicy { + fn get_re_exported_crate_path(&self, crate_name: &str) -> Option { + crate_name.strip_prefix("bevy_").map(|s| { + let mut path = PathPiece::new(); + path.push(syn::parse_str::(s).unwrap()); + path + }) + } } const BEVY: &str = "bevy"; -const BEVY_INTERNAL: &str = "bevy_internal"; + +const KNOWN_RE_EXPORTING_CRATE_BEVY: KnownReExportingCrate = KnownReExportingCrate { + re_exporting_crate_package_name: BEVY, + crate_re_exporting_policy: &BevyReExportingPolicy {}, +}; + +const ALL_KNOWN_RE_EXPORTING_CRATES: &[&KnownReExportingCrate] = &[&KNOWN_RE_EXPORTING_CRATE_BEVY]; + +/// The path to the `Cargo.toml` file for the Bevy project. +pub struct BevyManifest(MutexGuard<'static, CargoManifest>); impl BevyManifest { /// Returns a global shared instance of the [`BevyManifest`] struct. - pub fn shared() -> &'static LazyLock { - static LAZY_SELF: LazyLock = LazyLock::new(|| BevyManifest { - manifest: env::var_os("CARGO_MANIFEST_DIR") - .map(PathBuf::from) - .map(|mut path| { - path.push("Cargo.toml"); - if !path.exists() { - panic!( - "No Cargo manifest found for crate. Expected: {}", - path.display() - ); - } - let manifest = std::fs::read_to_string(path.clone()).unwrap_or_else(|_| { - panic!("Unable to read cargo manifest: {}", path.display()) - }); - manifest.parse::().unwrap_or_else(|_| { - panic!("Failed to parse cargo manifest: {}", path.display()) - }) - }) - .expect("CARGO_MANIFEST_DIR is not defined."), - }); - &LAZY_SELF + pub fn shared() -> Self { + Self(CargoManifest::shared()) } /// Attempt to retrieve the [path](syn::Path) of a particular package in /// the [manifest](BevyManifest) by [name](str). - pub fn maybe_get_path(&self, name: &str) -> Option { - fn dep_package(dep: &Item) -> Option<&str> { - if dep.as_str().is_some() { - None - } else { - dep.get("package").map(|name| name.as_str().unwrap()) - } - } - - let find_in_deps = |deps: &Item| -> Option { - let package = if let Some(dep) = deps.get(name) { - return Some(Self::parse_str(dep_package(dep).unwrap_or(name))); - } else if let Some(dep) = deps.get(BEVY) { - dep_package(dep).unwrap_or(BEVY) - } else if let Some(dep) = deps.get(BEVY_INTERNAL) { - dep_package(dep).unwrap_or(BEVY_INTERNAL) - } else { - return None; - }; - - let mut path = Self::parse_str::(package); - if let Some(module) = name.strip_prefix("bevy_") { - path.segments.push(Self::parse_str(module)); - } - Some(path) - }; - - let deps = self.manifest.get("dependencies"); - let deps_dev = self.manifest.get("dev-dependencies"); - - deps.and_then(find_in_deps) - .or_else(|| deps_dev.and_then(find_in_deps)) + pub fn maybe_get_path(&self, name: &str) -> Result { + self.0 + .try_resolve_crate_path(name, ALL_KNOWN_RE_EXPORTING_CRATES) } /// Returns the path for the crate with the given name. pub fn get_path(&self, name: &str) -> syn::Path { self.maybe_get_path(name) - .unwrap_or_else(|| Self::parse_str(name)) + //.expect("Failed to get path for crate") + .unwrap_or_else(|_err| Self::parse_str(name)) } /// Attempt to parse the provided [path](str) as a [syntax tree node](syn::parse::Parse) @@ -97,7 +69,7 @@ impl BevyManifest { } /// Attempt to get a subcrate [path](syn::Path) under Bevy by [name](str) - pub fn get_subcrate(&self, subcrate: &str) -> Option { + pub fn get_subcrate(&self, subcrate: &str) -> Result { self.maybe_get_path(BEVY) .map(|bevy_path| { let mut segments = bevy_path.segments; @@ -107,6 +79,6 @@ impl BevyManifest { segments, } }) - .or_else(|| self.maybe_get_path(&format!("bevy_{subcrate}"))) + .or_else(|_err| self.maybe_get_path(&format!("bevy_{subcrate}"))) } } diff --git a/crates/bevy_reflect/derive/src/trait_reflection.rs b/crates/bevy_reflect/derive/src/trait_reflection.rs index 24c452f2f1249..8df40e47a5fd0 100644 --- a/crates/bevy_reflect/derive/src/trait_reflection.rs +++ b/crates/bevy_reflect/derive/src/trait_reflection.rs @@ -1,7 +1,4 @@ -use bevy_macro_utils::{ - fq_std::{FQClone, FQOption, FQResult}, - BevyManifest, -}; +use bevy_macro_utils::fq_std::{FQClone, FQOption, FQResult}; use proc_macro::TokenStream; use quote::quote; use syn::{parse::Parse, parse_macro_input, Attribute, ItemTrait, Token}; @@ -34,7 +31,7 @@ pub(crate) fn reflect_trait(_args: &TokenStream, input: TokenStream) -> TokenStr let trait_ident = &item_trait.ident; let trait_vis = &item_trait.vis; let reflect_trait_ident = crate::ident::get_reflect_ident(&item_trait.ident.to_string()); - let bevy_reflect_path = BevyManifest::shared().get_path("bevy_reflect"); + let bevy_reflect_path = crate::meta::get_bevy_reflect_path(); let struct_doc = format!( " A type generated by the #[reflect_trait] macro for the `{trait_ident}` trait.\n\n This allows casting from `dyn Reflect` to `dyn {trait_ident}`.", diff --git a/crates/bevy_reflect/src/array.rs b/crates/bevy_reflect/src/array.rs index 3deff6f315c6e..300e69c2a71e9 100644 --- a/crates/bevy_reflect/src/array.rs +++ b/crates/bevy_reflect/src/array.rs @@ -1,8 +1,8 @@ use crate::generics::impl_generic_info_methods; use crate::{ - self as bevy_reflect, type_info::impl_type_methods, utility::reflect_hasher, ApplyError, - Generics, MaybeTyped, PartialReflect, Reflect, ReflectKind, ReflectMut, ReflectOwned, - ReflectRef, Type, TypeInfo, TypePath, + type_info::impl_type_methods, utility::reflect_hasher, ApplyError, Generics, MaybeTyped, + PartialReflect, Reflect, ReflectKind, ReflectMut, ReflectOwned, ReflectRef, Type, TypeInfo, + TypePath, }; use alloc::{boxed::Box, vec::Vec}; use bevy_reflect_derive::impl_type_path; diff --git a/crates/bevy_reflect/src/attributes.rs b/crates/bevy_reflect/src/attributes.rs index cc952d93f15c8..a6edefab25c65 100644 --- a/crates/bevy_reflect/src/attributes.rs +++ b/crates/bevy_reflect/src/attributes.rs @@ -178,7 +178,6 @@ pub(crate) use impl_custom_attribute_methods; #[cfg(test)] mod tests { use super::*; - use crate as bevy_reflect; use crate::{type_info::Typed, TypeInfo, VariantInfo}; use alloc::{format, string::String}; use core::ops::RangeInclusive; diff --git a/crates/bevy_reflect/src/enums/dynamic_enum.rs b/crates/bevy_reflect/src/enums/dynamic_enum.rs index 9162ab3610eaf..d9e228c07eaae 100644 --- a/crates/bevy_reflect/src/enums/dynamic_enum.rs +++ b/crates/bevy_reflect/src/enums/dynamic_enum.rs @@ -1,9 +1,9 @@ use bevy_reflect_derive::impl_type_path; use crate::{ - self as bevy_reflect, enum_debug, enum_hash, enum_partial_eq, ApplyError, DynamicStruct, - DynamicTuple, Enum, PartialReflect, Reflect, ReflectKind, ReflectMut, ReflectOwned, ReflectRef, - Struct, Tuple, TypeInfo, VariantFieldIter, VariantType, + enum_debug, enum_hash, enum_partial_eq, ApplyError, DynamicStruct, DynamicTuple, Enum, + PartialReflect, Reflect, ReflectKind, ReflectMut, ReflectOwned, ReflectRef, Struct, Tuple, + TypeInfo, VariantFieldIter, VariantType, }; use alloc::{boxed::Box, string::String}; diff --git a/crates/bevy_reflect/src/enums/enum_trait.rs b/crates/bevy_reflect/src/enums/enum_trait.rs index 3fe36fc8cfc07..d3f6550640012 100644 --- a/crates/bevy_reflect/src/enums/enum_trait.rs +++ b/crates/bevy_reflect/src/enums/enum_trait.rs @@ -317,7 +317,6 @@ impl<'a> VariantField<'a> { // Tests that need access to internal fields have to go here rather than in mod.rs #[cfg(test)] mod tests { - use crate as bevy_reflect; use crate::*; #[derive(Reflect, Debug, PartialEq)] diff --git a/crates/bevy_reflect/src/enums/mod.rs b/crates/bevy_reflect/src/enums/mod.rs index 89b5f17b1c8b8..fd657ffa7f25a 100644 --- a/crates/bevy_reflect/src/enums/mod.rs +++ b/crates/bevy_reflect/src/enums/mod.rs @@ -10,7 +10,6 @@ pub use variants::*; #[cfg(test)] mod tests { - use crate as bevy_reflect; use crate::*; use alloc::boxed::Box; diff --git a/crates/bevy_reflect/src/enums/variants.rs b/crates/bevy_reflect/src/enums/variants.rs index 142f95382081e..25e40334e7187 100644 --- a/crates/bevy_reflect/src/enums/variants.rs +++ b/crates/bevy_reflect/src/enums/variants.rs @@ -359,7 +359,6 @@ impl UnitVariantInfo { #[cfg(test)] mod tests { use super::*; - use crate as bevy_reflect; use crate::{Reflect, Typed}; #[test] diff --git a/crates/bevy_reflect/src/func/dynamic_function.rs b/crates/bevy_reflect/src/func/dynamic_function.rs index d7242fd8c6527..c090442ce483f 100644 --- a/crates/bevy_reflect/src/func/dynamic_function.rs +++ b/crates/bevy_reflect/src/func/dynamic_function.rs @@ -1,5 +1,4 @@ use crate::{ - self as bevy_reflect, __macro_exports::RegisterForReflection, func::{ args::{ArgCount, ArgList}, diff --git a/crates/bevy_reflect/src/generics.rs b/crates/bevy_reflect/src/generics.rs index 0f413d653dd3c..32b13100f552f 100644 --- a/crates/bevy_reflect/src/generics.rs +++ b/crates/bevy_reflect/src/generics.rs @@ -252,7 +252,6 @@ pub(crate) use impl_generic_info_methods; #[cfg(test)] mod tests { use super::*; - use crate as bevy_reflect; use crate::{Reflect, Typed}; use alloc::string::String; use core::fmt::Debug; diff --git a/crates/bevy_reflect/src/impls/foldhash.rs b/crates/bevy_reflect/src/impls/foldhash.rs index a4f1df44efefc..1b0452d433603 100644 --- a/crates/bevy_reflect/src/impls/foldhash.rs +++ b/crates/bevy_reflect/src/impls/foldhash.rs @@ -1,4 +1,4 @@ -use crate::{self as bevy_reflect, impl_type_path}; +use crate::impl_type_path; impl_type_path!(::foldhash::fast::FoldHasher); impl_type_path!(::foldhash::fast::FixedState); diff --git a/crates/bevy_reflect/src/impls/glam.rs b/crates/bevy_reflect/src/impls/glam.rs index 3d3821020bdd8..653eb3edaa55b 100644 --- a/crates/bevy_reflect/src/impls/glam.rs +++ b/crates/bevy_reflect/src/impls/glam.rs @@ -1,4 +1,3 @@ -use crate as bevy_reflect; use crate::{std_traits::ReflectDefault, ReflectDeserialize, ReflectSerialize}; use assert_type_match::assert_type_match; use bevy_reflect_derive::{impl_reflect, impl_reflect_opaque}; diff --git a/crates/bevy_reflect/src/impls/petgraph.rs b/crates/bevy_reflect/src/impls/petgraph.rs index f9ab09e1b9f26..2264c9cb4b9b2 100644 --- a/crates/bevy_reflect/src/impls/petgraph.rs +++ b/crates/bevy_reflect/src/impls/petgraph.rs @@ -1,7 +1,4 @@ -use crate::{ - self as bevy_reflect, impl_reflect_opaque, prelude::ReflectDefault, ReflectDeserialize, - ReflectSerialize, -}; +use crate::{impl_reflect_opaque, prelude::ReflectDefault, ReflectDeserialize, ReflectSerialize}; impl_reflect_opaque!(::petgraph::graph::NodeIndex( Default, diff --git a/crates/bevy_reflect/src/impls/smallvec.rs b/crates/bevy_reflect/src/impls/smallvec.rs index 5d92b03181fb9..afb75aff8d997 100644 --- a/crates/bevy_reflect/src/impls/smallvec.rs +++ b/crates/bevy_reflect/src/impls/smallvec.rs @@ -4,10 +4,10 @@ use core::any::Any; use smallvec::{Array as SmallArray, SmallVec}; use crate::{ - self as bevy_reflect, utility::GenericTypeInfoCell, ApplyError, FromReflect, FromType, - Generics, GetTypeRegistration, List, ListInfo, ListIter, MaybeTyped, PartialReflect, Reflect, - ReflectFromPtr, ReflectKind, ReflectMut, ReflectOwned, ReflectRef, TypeInfo, TypeParamInfo, - TypePath, TypeRegistration, Typed, + utility::GenericTypeInfoCell, ApplyError, FromReflect, FromType, Generics, GetTypeRegistration, + List, ListInfo, ListIter, MaybeTyped, PartialReflect, Reflect, ReflectFromPtr, ReflectKind, + ReflectMut, ReflectOwned, ReflectRef, TypeInfo, TypeParamInfo, TypePath, TypeRegistration, + Typed, }; impl List for SmallVec diff --git a/crates/bevy_reflect/src/impls/smol_str.rs b/crates/bevy_reflect/src/impls/smol_str.rs index 7a0f99e2ed7fe..e2c09b206b3be 100644 --- a/crates/bevy_reflect/src/impls/smol_str.rs +++ b/crates/bevy_reflect/src/impls/smol_str.rs @@ -1,6 +1,4 @@ -use crate::{ - self as bevy_reflect, std_traits::ReflectDefault, ReflectDeserialize, ReflectSerialize, -}; +use crate::{std_traits::ReflectDefault, ReflectDeserialize, ReflectSerialize}; use bevy_reflect_derive::impl_reflect_opaque; impl_reflect_opaque!(::smol_str::SmolStr( diff --git a/crates/bevy_reflect/src/impls/std.rs b/crates/bevy_reflect/src/impls/std.rs index cb7ee7859978a..447e480f14273 100644 --- a/crates/bevy_reflect/src/impls/std.rs +++ b/crates/bevy_reflect/src/impls/std.rs @@ -4,7 +4,7 @@ )] use crate::{ - self as bevy_reflect, impl_type_path, map_apply, map_partial_eq, map_try_apply, + impl_type_path, map_apply, map_partial_eq, map_try_apply, prelude::ReflectDefault, reflect::impl_full_reflect, set_apply, set_partial_eq, set_try_apply, @@ -2441,8 +2441,8 @@ crate::func::macros::impl_function_traits!(&'static Location<'static>); #[cfg(test)] mod tests { use crate::{ - self as bevy_reflect, Enum, FromReflect, PartialReflect, Reflect, ReflectSerialize, - TypeInfo, TypeRegistry, Typed, VariantInfo, VariantType, + Enum, FromReflect, PartialReflect, Reflect, ReflectSerialize, TypeInfo, TypeRegistry, + Typed, VariantInfo, VariantType, }; use alloc::{collections::BTreeMap, string::String, vec}; use bevy_platform_support::collections::HashMap; diff --git a/crates/bevy_reflect/src/impls/uuid.rs b/crates/bevy_reflect/src/impls/uuid.rs index 71f708c4d1da7..56beedd41ab41 100644 --- a/crates/bevy_reflect/src/impls/uuid.rs +++ b/crates/bevy_reflect/src/impls/uuid.rs @@ -1,5 +1,3 @@ -use crate as bevy_reflect; - use crate::{std_traits::ReflectDefault, ReflectDeserialize, ReflectSerialize}; use bevy_reflect_derive::impl_reflect_opaque; diff --git a/crates/bevy_reflect/src/impls/wgpu_types.rs b/crates/bevy_reflect/src/impls/wgpu_types.rs index 6f99b5d49699d..b4a1750ba1242 100644 --- a/crates/bevy_reflect/src/impls/wgpu_types.rs +++ b/crates/bevy_reflect/src/impls/wgpu_types.rs @@ -1,4 +1,4 @@ -use crate::{self as bevy_reflect, impl_reflect_opaque, ReflectDeserialize, ReflectSerialize}; +use crate::{impl_reflect_opaque, ReflectDeserialize, ReflectSerialize}; impl_reflect_opaque!(::wgpu_types::TextureFormat( Debug, diff --git a/crates/bevy_reflect/src/lib.rs b/crates/bevy_reflect/src/lib.rs index 31f0f023bf3fc..2845c716c5d54 100644 --- a/crates/bevy_reflect/src/lib.rs +++ b/crates/bevy_reflect/src/lib.rs @@ -564,6 +564,9 @@ extern crate std; extern crate alloc; +// Required to make proc macros work in bevy itself. +extern crate self as bevy_reflect; + mod array; mod fields; mod from_reflect; @@ -744,7 +747,6 @@ mod tests { use static_assertions::{assert_impl_all, assert_not_impl_all}; use super::{prelude::*, *}; - use crate as bevy_reflect; use crate::{ serde::{ReflectDeserializer, ReflectSerializer}, utility::GenericTypePathCell, diff --git a/crates/bevy_reflect/src/list.rs b/crates/bevy_reflect/src/list.rs index 2aff62241f252..e0f019c4b26dc 100644 --- a/crates/bevy_reflect/src/list.rs +++ b/crates/bevy_reflect/src/list.rs @@ -9,9 +9,9 @@ use bevy_reflect_derive::impl_type_path; use crate::generics::impl_generic_info_methods; use crate::{ - self as bevy_reflect, type_info::impl_type_methods, utility::reflect_hasher, ApplyError, - FromReflect, Generics, MaybeTyped, PartialReflect, Reflect, ReflectKind, ReflectMut, - ReflectOwned, ReflectRef, Type, TypeInfo, TypePath, + type_info::impl_type_methods, utility::reflect_hasher, ApplyError, FromReflect, Generics, + MaybeTyped, PartialReflect, Reflect, ReflectKind, ReflectMut, ReflectOwned, ReflectRef, Type, + TypeInfo, TypePath, }; /// A trait used to power [list-like] operations via [reflection]. diff --git a/crates/bevy_reflect/src/map.rs b/crates/bevy_reflect/src/map.rs index 0aa1ac7f83915..f71689d598804 100644 --- a/crates/bevy_reflect/src/map.rs +++ b/crates/bevy_reflect/src/map.rs @@ -4,9 +4,9 @@ use bevy_platform_support::collections::HashTable; use bevy_reflect_derive::impl_type_path; use crate::{ - self as bevy_reflect, generics::impl_generic_info_methods, type_info::impl_type_methods, - ApplyError, Generics, MaybeTyped, PartialReflect, Reflect, ReflectKind, ReflectMut, - ReflectOwned, ReflectRef, Type, TypeInfo, TypePath, + generics::impl_generic_info_methods, type_info::impl_type_methods, ApplyError, Generics, + MaybeTyped, PartialReflect, Reflect, ReflectKind, ReflectMut, ReflectOwned, ReflectRef, Type, + TypeInfo, TypePath, }; use alloc::{boxed::Box, format, vec::Vec}; diff --git a/crates/bevy_reflect/src/path/mod.rs b/crates/bevy_reflect/src/path/mod.rs index 320c414cdeed2..a52bbb6aaa688 100644 --- a/crates/bevy_reflect/src/path/mod.rs +++ b/crates/bevy_reflect/src/path/mod.rs @@ -512,7 +512,6 @@ impl core::ops::IndexMut for ParsedPath { )] mod tests { use super::*; - use crate as bevy_reflect; use crate::*; use alloc::vec; diff --git a/crates/bevy_reflect/src/serde/de/mod.rs b/crates/bevy_reflect/src/serde/de/mod.rs index 562fc6e90ce15..c6907b56ecbe3 100644 --- a/crates/bevy_reflect/src/serde/de/mod.rs +++ b/crates/bevy_reflect/src/serde/de/mod.rs @@ -38,7 +38,6 @@ mod tests { use bevy_platform_support::collections::{HashMap, HashSet}; use crate::{ - self as bevy_reflect, serde::{ ReflectDeserializer, ReflectDeserializerProcessor, ReflectSerializer, TypedReflectDeserializer, diff --git a/crates/bevy_reflect/src/serde/mod.rs b/crates/bevy_reflect/src/serde/mod.rs index 0fcc5854a6725..c31d97456679f 100644 --- a/crates/bevy_reflect/src/serde/mod.rs +++ b/crates/bevy_reflect/src/serde/mod.rs @@ -10,8 +10,8 @@ pub use type_data::*; mod tests { use super::*; use crate::{ - self as bevy_reflect, type_registry::TypeRegistry, DynamicStruct, DynamicTupleStruct, - FromReflect, PartialReflect, Reflect, Struct, + type_registry::TypeRegistry, DynamicStruct, DynamicTupleStruct, FromReflect, + PartialReflect, Reflect, Struct, }; use serde::de::DeserializeSeed; diff --git a/crates/bevy_reflect/src/serde/ser/mod.rs b/crates/bevy_reflect/src/serde/ser/mod.rs index be0ef027e45a3..6cfebc747f285 100644 --- a/crates/bevy_reflect/src/serde/ser/mod.rs +++ b/crates/bevy_reflect/src/serde/ser/mod.rs @@ -21,7 +21,6 @@ mod tuples; #[cfg(test)] mod tests { use crate::{ - self as bevy_reflect, serde::{ReflectSerializer, ReflectSerializerProcessor}, PartialReflect, Reflect, ReflectSerialize, Struct, TypeRegistry, }; diff --git a/crates/bevy_reflect/src/set.rs b/crates/bevy_reflect/src/set.rs index 8be3f388c9528..52b4e8b9a100e 100644 --- a/crates/bevy_reflect/src/set.rs +++ b/crates/bevy_reflect/src/set.rs @@ -7,9 +7,9 @@ use bevy_platform_support::collections::{ use bevy_reflect_derive::impl_type_path; use crate::{ - self as bevy_reflect, generics::impl_generic_info_methods, hash_error, - type_info::impl_type_methods, ApplyError, Generics, PartialReflect, Reflect, ReflectKind, - ReflectMut, ReflectOwned, ReflectRef, Type, TypeInfo, TypePath, + generics::impl_generic_info_methods, hash_error, type_info::impl_type_methods, ApplyError, + Generics, PartialReflect, Reflect, ReflectKind, ReflectMut, ReflectOwned, ReflectRef, Type, + TypeInfo, TypePath, }; /// A trait used to power [set-like] operations via [reflection]. diff --git a/crates/bevy_reflect/src/struct_trait.rs b/crates/bevy_reflect/src/struct_trait.rs index 7307b86e6ac83..dc7ed55cefef3 100644 --- a/crates/bevy_reflect/src/struct_trait.rs +++ b/crates/bevy_reflect/src/struct_trait.rs @@ -1,6 +1,5 @@ use crate::generics::impl_generic_info_methods; use crate::{ - self as bevy_reflect, attributes::{impl_custom_attribute_methods, CustomAttributes}, type_info::impl_type_methods, ApplyError, Generics, NamedField, PartialReflect, Reflect, ReflectKind, ReflectMut, @@ -585,7 +584,6 @@ pub fn struct_debug(dyn_struct: &dyn Struct, f: &mut Formatter<'_>) -> core::fmt #[cfg(test)] mod tests { - use crate as bevy_reflect; use crate::*; #[derive(Reflect, Default)] struct MyStruct { diff --git a/crates/bevy_reflect/src/tuple.rs b/crates/bevy_reflect/src/tuple.rs index 9790990a26bb7..28f95b6886cd8 100644 --- a/crates/bevy_reflect/src/tuple.rs +++ b/crates/bevy_reflect/src/tuple.rs @@ -3,10 +3,10 @@ use variadics_please::all_tuples; use crate::generics::impl_generic_info_methods; use crate::{ - self as bevy_reflect, type_info::impl_type_methods, utility::GenericTypePathCell, ApplyError, - FromReflect, Generics, GetTypeRegistration, MaybeTyped, PartialReflect, Reflect, ReflectKind, - ReflectMut, ReflectOwned, ReflectRef, Type, TypeInfo, TypePath, TypeRegistration, TypeRegistry, - Typed, UnnamedField, + type_info::impl_type_methods, utility::GenericTypePathCell, ApplyError, FromReflect, Generics, + GetTypeRegistration, MaybeTyped, PartialReflect, Reflect, ReflectKind, ReflectMut, + ReflectOwned, ReflectRef, Type, TypeInfo, TypePath, TypeRegistration, TypeRegistry, Typed, + UnnamedField, }; use alloc::{boxed::Box, vec, vec::Vec}; use core::{ diff --git a/crates/bevy_reflect/src/tuple_struct.rs b/crates/bevy_reflect/src/tuple_struct.rs index 57cc7acdb377a..8348ca7740861 100644 --- a/crates/bevy_reflect/src/tuple_struct.rs +++ b/crates/bevy_reflect/src/tuple_struct.rs @@ -2,7 +2,6 @@ use bevy_reflect_derive::impl_type_path; use crate::generics::impl_generic_info_methods; use crate::{ - self as bevy_reflect, attributes::{impl_custom_attribute_methods, CustomAttributes}, type_info::impl_type_methods, ApplyError, DynamicTuple, Generics, PartialReflect, Reflect, ReflectKind, ReflectMut, @@ -495,7 +494,6 @@ pub fn tuple_struct_debug( #[cfg(test)] mod tests { - use crate as bevy_reflect; use crate::*; #[derive(Reflect)] struct Ts(u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8); diff --git a/crates/bevy_reflect/src/type_registry.rs b/crates/bevy_reflect/src/type_registry.rs index ee7e31f84a925..d9d0e509bf410 100644 --- a/crates/bevy_reflect/src/type_registry.rs +++ b/crates/bevy_reflect/src/type_registry.rs @@ -859,7 +859,6 @@ impl FromType for ReflectFromPtr { )] mod test { use super::*; - use crate as bevy_reflect; #[test] fn test_reflect_from_ptr() { diff --git a/crates/bevy_render/macros/src/lib.rs b/crates/bevy_render/macros/src/lib.rs index 5f88f589ebca1..15b1add6b23b8 100644 --- a/crates/bevy_render/macros/src/lib.rs +++ b/crates/bevy_render/macros/src/lib.rs @@ -11,10 +11,7 @@ use quote::format_ident; use syn::{parse_macro_input, DeriveInput}; pub(crate) fn bevy_render_path() -> syn::Path { - BevyManifest::shared() - .maybe_get_path("bevy_render") - // NOTE: If the derivation is within bevy_render, then we need to return 'crate' - .unwrap_or_else(|| BevyManifest::parse_str("crate")) + BevyManifest::shared().get_path("bevy_render") } #[proc_macro_derive(ExtractResource)] diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index a11805512cec9..050da078dc540 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -19,6 +19,9 @@ compile_error!("bevy_render cannot compile for a 16-bit platform."); extern crate alloc; extern crate core; +// Required to make proc macros work in bevy itself. +extern crate self as bevy_render; + pub mod alpha; pub mod batching; pub mod camera; diff --git a/crates/bevy_render/src/render_resource/bind_group.rs b/crates/bevy_render/src/render_resource/bind_group.rs index 10daeae1ab307..9b29e453a7cfc 100644 --- a/crates/bevy_render/src/render_resource/bind_group.rs +++ b/crates/bevy_render/src/render_resource/bind_group.rs @@ -528,7 +528,6 @@ where #[cfg(test)] mod test { use super::*; - use crate as bevy_render; use bevy_asset::Handle; use bevy_image::Image; diff --git a/crates/bevy_state/src/app.rs b/crates/bevy_state/src/app.rs index b00c60de53738..2419efd4d8a99 100644 --- a/crates/bevy_state/src/app.rs +++ b/crates/bevy_state/src/app.rs @@ -316,7 +316,6 @@ impl Plugin for StatesPlugin { #[cfg(test)] mod tests { use crate::{ - self as bevy_state, app::StatesPlugin, state::{State, StateTransition, StateTransitionEvent}, }; diff --git a/crates/bevy_state/src/condition.rs b/crates/bevy_state/src/condition.rs index f0a619708776d..1d14d9da070cd 100644 --- a/crates/bevy_state/src/condition.rs +++ b/crates/bevy_state/src/condition.rs @@ -171,8 +171,6 @@ pub fn state_changed(current_state: Option>>) -> bool { #[cfg(test)] mod tests { - use crate as bevy_state; - use bevy_ecs::schedule::{Condition, IntoSystemConfigs, Schedule}; use crate::prelude::*; diff --git a/crates/bevy_state/src/lib.rs b/crates/bevy_state/src/lib.rs index f25553747552f..b2714b50c5025 100644 --- a/crates/bevy_state/src/lib.rs +++ b/crates/bevy_state/src/lib.rs @@ -43,6 +43,9 @@ extern crate std; extern crate alloc; +// Required to make proc macros work in bevy itself. +extern crate self as bevy_state; + #[cfg(feature = "bevy_app")] /// Provides [`App`](bevy_app::App) and [`SubApp`](bevy_app::SubApp) with state installation methods pub mod app; diff --git a/crates/bevy_state/src/reflect.rs b/crates/bevy_state/src/reflect.rs index c620cd4638466..0ff09c3759d21 100644 --- a/crates/bevy_state/src/reflect.rs +++ b/crates/bevy_state/src/reflect.rs @@ -98,7 +98,6 @@ impl FromType for ReflectFreelyMu #[cfg(test)] mod tests { - use crate as bevy_state; use crate::{ app::{AppExtStates, StatesPlugin}, reflect::{ReflectFreelyMutableState, ReflectState}, diff --git a/crates/bevy_state/src/state/mod.rs b/crates/bevy_state/src/state/mod.rs index c71827cc5f06b..9267478281575 100644 --- a/crates/bevy_state/src/state/mod.rs +++ b/crates/bevy_state/src/state/mod.rs @@ -22,7 +22,6 @@ mod tests { use bevy_state_macros::{States, SubStates}; use super::*; - use crate as bevy_state; #[derive(States, PartialEq, Eq, Debug, Default, Hash, Clone)] enum SimpleState { diff --git a/tests-integration/remapped-test/Cargo.toml b/tests-integration/remapped-test/Cargo.toml new file mode 100644 index 0000000000000..808692ada0a7e --- /dev/null +++ b/tests-integration/remapped-test/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "remapped-test" +edition = "2021" + +[dependencies] +bevi = { path = "../../", package = "bevy" } diff --git a/tests-integration/remapped-test/src/lib.rs b/tests-integration/remapped-test/src/lib.rs new file mode 100644 index 0000000000000..6b7afa81e813d --- /dev/null +++ b/tests-integration/remapped-test/src/lib.rs @@ -0,0 +1,21 @@ +#![allow(dead_code)] +use bevi::prelude::*; + +#[derive(Component)] +struct _Component { + _value: f32, +} + +#[derive(Resource)] +struct _Resource { + _value: f32, +} + +fn hello_world() { + println!("hello world!"); +} + +#[test] +fn simple_ecs_test() { + App::new().add_systems(Update, hello_world).run(); +} diff --git a/tests-integration/simple-ecs-test/Cargo.toml b/tests-integration/simple-ecs-test/Cargo.toml new file mode 100644 index 0000000000000..0440338bb4e5c --- /dev/null +++ b/tests-integration/simple-ecs-test/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "simple-ecs-test" +edition = "2021" + +[dependencies] +bevy = { path = "../../" } diff --git a/tests-integration/simple-ecs-test/src/lib.rs b/tests-integration/simple-ecs-test/src/lib.rs new file mode 100644 index 0000000000000..09eee5ed24372 --- /dev/null +++ b/tests-integration/simple-ecs-test/src/lib.rs @@ -0,0 +1,36 @@ +#![allow(dead_code)] +use bevy::prelude::*; + +#[derive(Component)] +struct MyComponent { + value: f32, +} + +#[derive(Resource)] +struct MyResource { + value: f32, +} + +fn hello_world(query: Query<&MyComponent>, resource: Res) { + let component = query.iter().next().unwrap(); + let comp_value = component.value; // rust-analyzer suggestions work + let res_value_deref = resource.value; // rust-analyzer suggestions don't work but ctrl+click works once it's written, also type inlay hints work correctly + let res_value_direct = resource.into_inner().value; // rust-analyzer suggestions work + println!( + "hello world! Value: {} {} {}", + comp_value, res_value_deref, res_value_direct + ); +} + +fn spawn_component(mut commands: Commands) { + commands.spawn(MyComponent { value: 10.0 }); +} + +#[test] +fn simple_ecs_test() { + App::new() + .insert_resource(MyResource { value: 5.0 }) + .add_systems(Startup, spawn_component) + .add_systems(Update, hello_world) + .run(); +} diff --git a/tools/ci/src/ci.rs b/tools/ci/src/ci.rs index 043a887e37ec7..07470967f2b53 100644 --- a/tools/ci/src/ci.rs +++ b/tools/ci/src/ci.rs @@ -74,6 +74,13 @@ impl CI { cmds.append(&mut commands::ClippyCommand::default().prepare(sh, flags)); cmds.append(&mut commands::TestCommand::default().prepare(sh, flags)); cmds.append(&mut commands::TestCheckCommand::default().prepare(sh, flags)); + cmds.append(&mut commands::IntegrationTestCommand::default().prepare(sh, flags)); + cmds.append( + &mut commands::IntegrationTestCheckCommand::default().prepare(sh, flags), + ); + cmds.append( + &mut commands::IntegrationTestCleanCommand::default().prepare(sh, flags), + ); cmds.append(&mut commands::DocCheckCommand::default().prepare(sh, flags)); cmds.append(&mut commands::DocTestCommand::default().prepare(sh, flags)); cmds.append(&mut commands::CompileCheckCommand::default().prepare(sh, flags)); @@ -100,6 +107,9 @@ enum Commands { Clippy(commands::ClippyCommand), Test(commands::TestCommand), TestCheck(commands::TestCheckCommand), + IntegrationTest(commands::IntegrationTestCommand), + IntegrationTestCheck(commands::IntegrationTestCheckCommand), + IntegrationTestClean(commands::IntegrationTestCleanCommand), DocCheck(commands::DocCheckCommand), DocTest(commands::DocTestCommand), CompileCheck(commands::CompileCheckCommand), @@ -120,6 +130,9 @@ impl Prepare for Commands { Commands::Clippy(subcommand) => subcommand.prepare(sh, flags), Commands::Test(subcommand) => subcommand.prepare(sh, flags), Commands::TestCheck(subcommand) => subcommand.prepare(sh, flags), + Commands::IntegrationTest(subcommand) => subcommand.prepare(sh, flags), + Commands::IntegrationTestCheck(subcommand) => subcommand.prepare(sh, flags), + Commands::IntegrationTestClean(subcommand) => subcommand.prepare(sh, flags), Commands::DocCheck(subcommand) => subcommand.prepare(sh, flags), Commands::DocTest(subcommand) => subcommand.prepare(sh, flags), Commands::CompileCheck(subcommand) => subcommand.prepare(sh, flags), diff --git a/tools/ci/src/commands/compile.rs b/tools/ci/src/commands/compile.rs index f3fcefabb153e..f445aaca57331 100644 --- a/tools/ci/src/commands/compile.rs +++ b/tools/ci/src/commands/compile.rs @@ -1,13 +1,13 @@ use crate::{ commands::{ BenchCheckCommand, CompileCheckCommand, CompileFailCommand, ExampleCheckCommand, - TestCheckCommand, + IntegrationTestCheckCommand, TestCheckCommand, }, Flag, Prepare, PreparedCommand, }; use argh::FromArgs; -/// Alias for running the `compile-fail`, `bench-check`, `example-check`, `compile-check`, and `test-check` subcommands. +/// Alias for running the `compile-fail`, `bench-check`, `example-check`, `compile-check`, `test-check` and `test-integration-check` subcommands. #[derive(FromArgs, Default)] #[argh(subcommand, name = "compile")] pub struct CompileCommand {} @@ -20,6 +20,7 @@ impl Prepare for CompileCommand { commands.append(&mut ExampleCheckCommand::default().prepare(sh, flags)); commands.append(&mut CompileCheckCommand::default().prepare(sh, flags)); commands.append(&mut TestCheckCommand::default().prepare(sh, flags)); + commands.append(&mut IntegrationTestCheckCommand::default().prepare(sh, flags)); commands } } diff --git a/tools/ci/src/commands/integration_test.rs b/tools/ci/src/commands/integration_test.rs new file mode 100644 index 0000000000000..b86a027a56026 --- /dev/null +++ b/tools/ci/src/commands/integration_test.rs @@ -0,0 +1,30 @@ +use crate::{commands::get_integration_tests, Flag, Prepare, PreparedCommand}; +use argh::FromArgs; +use xshell::cmd; + +/// Runs all integration tests (except for doc tests). +#[derive(FromArgs, Default)] +#[argh(subcommand, name = "integration-test")] +pub struct IntegrationTestCommand {} + +impl Prepare for IntegrationTestCommand { + fn prepare<'a>(&self, sh: &'a xshell::Shell, flags: Flag) -> Vec> { + let no_fail_fast = flags + .contains(Flag::KEEP_GOING) + .then_some("--no-fail-fast") + .unwrap_or_default(); + + get_integration_tests(sh) + .into_iter() + .map(|path| { + PreparedCommand::new::( + cmd!( + sh, + "cargo test --manifest-path {path}/Cargo.toml --tests {no_fail_fast}" + ), + "Please fix failing integration tests in output above.", + ) + }) + .collect() + } +} diff --git a/tools/ci/src/commands/integration_test_check.rs b/tools/ci/src/commands/integration_test_check.rs new file mode 100644 index 0000000000000..d10808a746fc2 --- /dev/null +++ b/tools/ci/src/commands/integration_test_check.rs @@ -0,0 +1,35 @@ +use std::path::Path; + +use crate::{Flag, Prepare, PreparedCommand}; +use argh::FromArgs; +use xshell::cmd; + +pub fn get_integration_tests(sh: &xshell::Shell) -> Vec { + let integration_test_paths = sh.read_dir(Path::new("./tests-integration")).unwrap(); + + // Filter out non-directories + integration_test_paths + .into_iter() + .filter(|path| path.is_dir()) + .map(|path| path.to_string_lossy().to_string()) + .collect() +} + +/// Checks that all integration tests compile. +#[derive(FromArgs, Default)] +#[argh(subcommand, name = "integration-test-check")] +pub struct IntegrationTestCheckCommand {} + +impl Prepare for IntegrationTestCheckCommand { + fn prepare<'a>(&self, sh: &'a xshell::Shell, _flags: Flag) -> Vec> { + get_integration_tests(sh) + .into_iter() + .map(|path| { + PreparedCommand::new::( + cmd!(sh, "cargo check --manifest-path {path}/Cargo.toml --tests"), + "Please fix compiler errors for tests in output above.", + ) + }) + .collect() + } +} diff --git a/tools/ci/src/commands/integration_test_clean.rs b/tools/ci/src/commands/integration_test_clean.rs new file mode 100644 index 0000000000000..9ad7a44f0ba6a --- /dev/null +++ b/tools/ci/src/commands/integration_test_clean.rs @@ -0,0 +1,24 @@ +use crate::{Flag, Prepare, PreparedCommand}; +use argh::FromArgs; +use xshell::cmd; + +use super::get_integration_tests; + +/// Cleans the build artifacts for all integration tests. +#[derive(FromArgs, Default)] +#[argh(subcommand, name = "integration-test-clean")] +pub struct IntegrationTestCleanCommand {} + +impl Prepare for IntegrationTestCleanCommand { + fn prepare<'a>(&self, sh: &'a xshell::Shell, _flags: Flag) -> Vec> { + get_integration_tests(sh) + .into_iter() + .map(|path| { + PreparedCommand::new::( + cmd!(sh, "cargo clean --manifest-path {path}/Cargo.toml"), + "Failed to clean integration test.", + ) + }) + .collect() + } +} diff --git a/tools/ci/src/commands/mod.rs b/tools/ci/src/commands/mod.rs index 696155aee96ca..abbd862cbd8f6 100644 --- a/tools/ci/src/commands/mod.rs +++ b/tools/ci/src/commands/mod.rs @@ -9,6 +9,9 @@ pub use doc_check::*; pub use doc_test::*; pub use example_check::*; pub use format::*; +pub use integration_test::*; +pub use integration_test_check::*; +pub use integration_test_clean::*; pub use lints::*; pub use test::*; pub use test_check::*; @@ -24,6 +27,9 @@ mod doc_check; mod doc_test; mod example_check; mod format; +mod integration_test; +mod integration_test_check; +mod integration_test_clean; mod lints; mod test; mod test_check; diff --git a/tools/ci/src/commands/test_check.rs b/tools/ci/src/commands/test_check.rs index 81f11c214a8fa..8671b4f6cf442 100644 --- a/tools/ci/src/commands/test_check.rs +++ b/tools/ci/src/commands/test_check.rs @@ -11,7 +11,7 @@ impl Prepare for TestCheckCommand { fn prepare<'a>(&self, sh: &'a xshell::Shell, _flags: Flag) -> Vec> { vec![PreparedCommand::new::( cmd!(sh, "cargo check --workspace --tests"), - "Please fix compiler examples for tests in output above.", + "Please fix compiler errors for tests in output above.", )] } }