Skip to content

Commit ec7bfd9

Browse files
committed
Format generic labels
1 parent d6d78d2 commit ec7bfd9

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

crates/bevy_ecs/examples/derive_label.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ fn main() {
1818
GenericLabel::<f64>::One.as_label(),
1919
GenericLabel::<char>::One.as_label(),
2020
);
21+
22+
assert_eq!(format!("{:?}", UnitLabel.as_label()), "UnitLabel");
23+
assert_eq!(format!("{:?}", WeirdLabel(1).as_label()), "WeirdLabel");
24+
assert_eq!(format!("{:?}", WeirdLabel(2).as_label()), "WeirdLabel");
25+
assert_eq!(
26+
format!("{:?}", GenericLabel::<f64>::One.as_label()),
27+
"GenericLabel::One::<f64>"
28+
);
29+
assert_eq!(
30+
format!("{:?}", ConstGenericLabel::<21>.as_label()),
31+
"ConstGenericLabel::<21>"
32+
);
2133
}
2234

2335
#[derive(SystemLabel)]
@@ -40,6 +52,9 @@ pub enum GenericLabel<T> {
4052
Two(PhantomData<T>),
4153
}
4254

55+
#[derive(SystemLabel)]
56+
pub struct ConstGenericLabel<const N: usize>;
57+
4358
// FIXME: this should be a compile_fail test
4459
/*#[derive(SystemLabel)]
4560
pub union Foo {

crates/bevy_macro_utils/src/lib.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,33 @@ fn derive_named_label(
271271
}
272272
};
273273

274+
// Formatting for generics
275+
let generics = input.generics.params.iter();
276+
let fmt_generics = generics
277+
.filter_map(|p| match p {
278+
syn::GenericParam::Type(ty) => Some({
279+
let ident = &ty.ident;
280+
quote! { write!(f, "{}", ::std::any::type_name::<#ident>()) }
281+
}),
282+
syn::GenericParam::Const(c) => Some({
283+
let ident = &c.ident;
284+
quote! { write!(f, "{:?}", { #ident }) }
285+
}),
286+
_ => None,
287+
})
288+
.reduce(|a, b| quote! { #a?; write!(f, ", ")?; #b })
289+
.map(|x| quote! { write!(f, "::<")?; #x?; write!(f, ">")?; });
290+
274291
Ok(quote! {
275292
impl #impl_generics #trait_path for #ident #ty_generics #where_clause {
276293
#[inline]
277294
fn data(&self) -> u64 {
278295
#data
279296
}
280297
fn fmt(data: u64, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
281-
#fmt
298+
#fmt?;
299+
#fmt_generics
300+
Ok(())
282301
}
283302
}
284303
})

0 commit comments

Comments
 (0)