Use crate: disqualified (#15372)
# Objective Fixes #15351 ## Solution - Created new external crate and ported over the code ## Testing - CI ## Migration guide Replace references to `bevy_utils::ShortName` with `disqualified::ShortName`.
This commit is contained in:
parent
21da0b72ae
commit
8a6d0b063c
@ -35,6 +35,7 @@ async-fs = "2.0"
|
|||||||
async-lock = "3.0"
|
async-lock = "3.0"
|
||||||
crossbeam-channel = "0.5"
|
crossbeam-channel = "0.5"
|
||||||
downcast-rs = "1.2"
|
downcast-rs = "1.2"
|
||||||
|
disqualified = "1.0"
|
||||||
futures-io = "0.3"
|
futures-io = "0.3"
|
||||||
futures-lite = "2.0.1"
|
futures-lite = "2.0.1"
|
||||||
blake3 = "1.5"
|
blake3 = "1.5"
|
||||||
|
|||||||
@ -3,8 +3,9 @@ use crate::{
|
|||||||
UntypedAssetId,
|
UntypedAssetId,
|
||||||
};
|
};
|
||||||
use bevy_ecs::prelude::*;
|
use bevy_ecs::prelude::*;
|
||||||
use bevy_reflect::{std_traits::ReflectDefault, Reflect, ShortName, TypePath};
|
use bevy_reflect::{std_traits::ReflectDefault, Reflect, TypePath};
|
||||||
use crossbeam_channel::{Receiver, Sender};
|
use crossbeam_channel::{Receiver, Sender};
|
||||||
|
use disqualified::ShortName;
|
||||||
use std::{
|
use std::{
|
||||||
any::TypeId,
|
any::TypeId,
|
||||||
hash::{Hash, Hasher},
|
hash::{Hash, Hasher},
|
||||||
|
|||||||
@ -29,6 +29,7 @@ bevy_ecs_macros = { path = "macros", version = "0.15.0-dev" }
|
|||||||
petgraph = "0.6"
|
petgraph = "0.6"
|
||||||
bitflags = "2.3"
|
bitflags = "2.3"
|
||||||
concurrent-queue = "2.4.0"
|
concurrent-queue = "2.4.0"
|
||||||
|
disqualified = "1.0"
|
||||||
fixedbitset = "0.5"
|
fixedbitset = "0.5"
|
||||||
serde = { version = "1", optional = true, default-features = false }
|
serde = { version = "1", optional = true, default-features = false }
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
|
|||||||
@ -10,6 +10,7 @@ use bevy_utils::{
|
|||||||
tracing::{error, warn},
|
tracing::{error, warn},
|
||||||
HashMap, HashSet,
|
HashMap, HashSet,
|
||||||
};
|
};
|
||||||
|
use disqualified::ShortName;
|
||||||
use fixedbitset::FixedBitSet;
|
use fixedbitset::FixedBitSet;
|
||||||
use petgraph::{algo::TarjanScc, prelude::*};
|
use petgraph::{algo::TarjanScc, prelude::*};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
@ -1607,17 +1608,12 @@ impl ScheduleGraph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#[cfg(feature = "bevy_reflect")]
|
|
||||||
{
|
|
||||||
if self.settings.use_shortnames {
|
if self.settings.use_shortnames {
|
||||||
bevy_reflect::ShortName(&name).to_string()
|
ShortName(&name).to_string()
|
||||||
} else {
|
} else {
|
||||||
name
|
name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(not(feature = "bevy_reflect"))]
|
|
||||||
name
|
|
||||||
}
|
|
||||||
|
|
||||||
fn anonymous_set_name(&self, id: &NodeId) -> String {
|
fn anonymous_set_name(&self, id: &NodeId) -> String {
|
||||||
format!(
|
format!(
|
||||||
@ -2018,7 +2014,6 @@ pub struct ScheduleBuildSettings {
|
|||||||
/// If set to true, node names will be shortened instead of the fully qualified type path.
|
/// If set to true, node names will be shortened instead of the fully qualified type path.
|
||||||
///
|
///
|
||||||
/// Defaults to `true`.
|
/// Defaults to `true`.
|
||||||
#[cfg(feature = "bevy_reflect")]
|
|
||||||
pub use_shortnames: bool,
|
pub use_shortnames: bool,
|
||||||
/// If set to true, report all system sets the conflicting systems are part of.
|
/// If set to true, report all system sets the conflicting systems are part of.
|
||||||
///
|
///
|
||||||
@ -2040,7 +2035,6 @@ impl ScheduleBuildSettings {
|
|||||||
ambiguity_detection: LogLevel::Ignore,
|
ambiguity_detection: LogLevel::Ignore,
|
||||||
hierarchy_detection: LogLevel::Warn,
|
hierarchy_detection: LogLevel::Warn,
|
||||||
auto_insert_apply_deferred: true,
|
auto_insert_apply_deferred: true,
|
||||||
#[cfg(feature = "bevy_reflect")]
|
|
||||||
use_shortnames: true,
|
use_shortnames: true,
|
||||||
report_sets: true,
|
report_sets: true,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,6 +24,7 @@ bevy_reflect = { path = "../bevy_reflect", version = "0.15.0-dev", features = [
|
|||||||
"smallvec",
|
"smallvec",
|
||||||
], optional = true }
|
], optional = true }
|
||||||
bevy_utils = { path = "../bevy_utils", version = "0.15.0-dev" }
|
bevy_utils = { path = "../bevy_utils", version = "0.15.0-dev" }
|
||||||
|
disqualified = "1.0"
|
||||||
|
|
||||||
smallvec = { version = "1.11", features = ["union", "const_generics"] }
|
smallvec = { version = "1.11", features = ["union", "const_generics"] }
|
||||||
|
|
||||||
|
|||||||
@ -4,9 +4,9 @@ use std::marker::PhantomData;
|
|||||||
use crate::Parent;
|
use crate::Parent;
|
||||||
use bevy_ecs::prelude::*;
|
use bevy_ecs::prelude::*;
|
||||||
#[cfg(feature = "bevy_app")]
|
#[cfg(feature = "bevy_app")]
|
||||||
use bevy_reflect::ShortName;
|
|
||||||
#[cfg(feature = "bevy_app")]
|
|
||||||
use bevy_utils::HashSet;
|
use bevy_utils::HashSet;
|
||||||
|
#[cfg(feature = "bevy_app")]
|
||||||
|
use disqualified::ShortName;
|
||||||
|
|
||||||
/// When enabled, runs [`check_hierarchy_component_has_valid_parent<T>`].
|
/// When enabled, runs [`check_hierarchy_component_has_valid_parent<T>`].
|
||||||
///
|
///
|
||||||
|
|||||||
@ -36,6 +36,7 @@ bevy_ptr = { path = "../bevy_ptr", version = "0.15.0-dev" }
|
|||||||
|
|
||||||
# other
|
# other
|
||||||
erased-serde = "0.4"
|
erased-serde = "0.4"
|
||||||
|
disqualified = "1.0"
|
||||||
downcast-rs = "1.2"
|
downcast-rs = "1.2"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
serde = "1"
|
serde = "1"
|
||||||
|
|||||||
@ -553,7 +553,6 @@ mod reflect;
|
|||||||
mod reflectable;
|
mod reflectable;
|
||||||
mod remote;
|
mod remote;
|
||||||
mod set;
|
mod set;
|
||||||
mod short_name;
|
|
||||||
mod struct_trait;
|
mod struct_trait;
|
||||||
mod tuple;
|
mod tuple;
|
||||||
mod tuple_struct;
|
mod tuple_struct;
|
||||||
@ -623,7 +622,6 @@ pub use type_registry::*;
|
|||||||
|
|
||||||
pub use bevy_reflect_derive::*;
|
pub use bevy_reflect_derive::*;
|
||||||
pub use erased_serde;
|
pub use erased_serde;
|
||||||
pub use short_name::ShortName;
|
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
@ -680,6 +678,7 @@ pub mod __macro_exports {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use ::serde::{de::DeserializeSeed, Deserialize, Serialize};
|
use ::serde::{de::DeserializeSeed, Deserialize, Serialize};
|
||||||
use bevy_utils::HashMap;
|
use bevy_utils::HashMap;
|
||||||
|
use disqualified::ShortName;
|
||||||
use ron::{
|
use ron::{
|
||||||
ser::{to_string_pretty, PrettyConfig},
|
ser::{to_string_pretty, PrettyConfig},
|
||||||
Deserializer,
|
Deserializer,
|
||||||
|
|||||||
@ -1,214 +0,0 @@
|
|||||||
/// Lazily shortens a type name to remove all module paths.
|
|
||||||
///
|
|
||||||
/// The short name of a type is its full name as returned by
|
|
||||||
/// [`std::any::type_name`], but with the prefix of all paths removed. For
|
|
||||||
/// example, the short name of `alloc::vec::Vec<core::option::Option<u32>>`
|
|
||||||
/// would be `Vec<Option<u32>>`.
|
|
||||||
///
|
|
||||||
/// Shortening is performed lazily without allocation.
|
|
||||||
#[cfg_attr(
|
|
||||||
feature = "alloc",
|
|
||||||
doc = r#" To get a [`String`] from this type, use the [`to_string`](`alloc::string::ToString::to_string`) method."#
|
|
||||||
)]
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```rust
|
|
||||||
/// # use bevy_reflect::ShortName;
|
|
||||||
/// #
|
|
||||||
/// # mod foo {
|
|
||||||
/// # pub mod bar {
|
|
||||||
/// # pub struct Baz;
|
|
||||||
/// # }
|
|
||||||
/// # }
|
|
||||||
/// // Baz
|
|
||||||
/// let short_name = ShortName::of::<foo::bar::Baz>();
|
|
||||||
/// ```
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
pub struct ShortName<'a>(pub &'a str);
|
|
||||||
|
|
||||||
impl ShortName<'static> {
|
|
||||||
/// Gets a shortened version of the name of the type `T`.
|
|
||||||
pub fn of<T: ?Sized>() -> Self {
|
|
||||||
Self(core::any::type_name::<T>())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> ShortName<'a> {
|
|
||||||
/// Gets the original name before shortening.
|
|
||||||
pub const fn original(&self) -> &'a str {
|
|
||||||
self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> From<&'a str> for ShortName<'a> {
|
|
||||||
fn from(value: &'a str) -> Self {
|
|
||||||
Self(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> core::fmt::Debug for ShortName<'a> {
|
|
||||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
|
||||||
let &ShortName(full_name) = self;
|
|
||||||
// Generics result in nested paths within <..> blocks.
|
|
||||||
// Consider "bevy_render::camera::camera::extract_cameras<bevy_render::camera::bundle::Camera3d>".
|
|
||||||
// To tackle this, we parse the string from left to right, collapsing as we go.
|
|
||||||
let mut index: usize = 0;
|
|
||||||
let end_of_string = full_name.len();
|
|
||||||
|
|
||||||
while index < end_of_string {
|
|
||||||
let rest_of_string = full_name.get(index..end_of_string).unwrap_or_default();
|
|
||||||
|
|
||||||
// Collapse everything up to the next special character,
|
|
||||||
// then skip over it
|
|
||||||
if let Some(special_character_index) = rest_of_string.find(|c: char| {
|
|
||||||
(c == ' ')
|
|
||||||
|| (c == '<')
|
|
||||||
|| (c == '>')
|
|
||||||
|| (c == '(')
|
|
||||||
|| (c == ')')
|
|
||||||
|| (c == '[')
|
|
||||||
|| (c == ']')
|
|
||||||
|| (c == ',')
|
|
||||||
|| (c == ';')
|
|
||||||
}) {
|
|
||||||
let segment_to_collapse = rest_of_string
|
|
||||||
.get(0..special_character_index)
|
|
||||||
.unwrap_or_default();
|
|
||||||
|
|
||||||
f.write_str(collapse_type_name(segment_to_collapse))?;
|
|
||||||
|
|
||||||
// Insert the special character
|
|
||||||
let special_character =
|
|
||||||
&rest_of_string[special_character_index..=special_character_index];
|
|
||||||
|
|
||||||
f.write_str(special_character)?;
|
|
||||||
|
|
||||||
match special_character {
|
|
||||||
">" | ")" | "]"
|
|
||||||
if rest_of_string[special_character_index + 1..].starts_with("::") =>
|
|
||||||
{
|
|
||||||
f.write_str("::")?;
|
|
||||||
// Move the index past the "::"
|
|
||||||
index += special_character_index + 3;
|
|
||||||
}
|
|
||||||
// Move the index just past the special character
|
|
||||||
_ => index += special_character_index + 1,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// If there are no special characters left, we're done!
|
|
||||||
f.write_str(collapse_type_name(rest_of_string))?;
|
|
||||||
index = end_of_string;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> core::fmt::Display for ShortName<'a> {
|
|
||||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
|
||||||
<Self as core::fmt::Debug>::fmt(self, f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
fn collapse_type_name(string: &str) -> &str {
|
|
||||||
// Enums types are retained.
|
|
||||||
// As heuristic, we assume the enum type to be uppercase.
|
|
||||||
let mut segments = string.rsplit("::");
|
|
||||||
let (last, second_last): (&str, Option<&str>) = (segments.next().unwrap(), segments.next());
|
|
||||||
let Some(second_last) = second_last else {
|
|
||||||
return last;
|
|
||||||
};
|
|
||||||
|
|
||||||
if second_last.starts_with(char::is_uppercase) {
|
|
||||||
let index = string.len() - last.len() - second_last.len() - 2;
|
|
||||||
&string[index..]
|
|
||||||
} else {
|
|
||||||
last
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(all(test, feature = "alloc"))]
|
|
||||||
mod name_formatting_tests {
|
|
||||||
use super::ShortName;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn trivial() {
|
|
||||||
assert_eq!(ShortName("test_system").to_string(), "test_system");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn path_separated() {
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("bevy_prelude::make_fun_game").to_string(),
|
|
||||||
"make_fun_game"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn tuple_type() {
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("(String, String)").to_string(),
|
|
||||||
"(String, String)"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn array_type() {
|
|
||||||
assert_eq!(ShortName("[i32; 3]").to_string(), "[i32; 3]");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn trivial_generics() {
|
|
||||||
assert_eq!(ShortName("a<B>").to_string(), "a<B>");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn multiple_type_parameters() {
|
|
||||||
assert_eq!(ShortName("a<B, C>").to_string(), "a<B, C>");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn enums() {
|
|
||||||
assert_eq!(ShortName("Option::None").to_string(), "Option::None");
|
|
||||||
assert_eq!(ShortName("Option::Some(2)").to_string(), "Option::Some(2)");
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("bevy_render::RenderSet::Prepare").to_string(),
|
|
||||||
"RenderSet::Prepare"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn generics() {
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("bevy_render::camera::camera::extract_cameras<bevy_render::camera::bundle::Camera3d>").to_string(),
|
|
||||||
"extract_cameras<Camera3d>"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn nested_generics() {
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("bevy::mad_science::do_mad_science<mad_science::Test<mad_science::Tube>, bavy::TypeSystemAbuse>").to_string(),
|
|
||||||
"do_mad_science<Test<Tube>, TypeSystemAbuse>"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn sub_path_after_closing_bracket() {
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("bevy_asset::assets::Assets<bevy_scene::dynamic_scene::DynamicScene>::asset_event_system").to_string(),
|
|
||||||
"Assets<DynamicScene>::asset_event_system"
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("(String, String)::default").to_string(),
|
|
||||||
"(String, String)::default"
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
ShortName("[i32; 16]::default").to_string(),
|
|
||||||
"[i32; 16]::default"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user