Macros that produce the name of the function they're invoked within.
The uninstantiated!
macro produces the name of the surrounding function or method, without generics instantiated; e.g.:
struct GenericType<A>(A);
impl<A> GenericType<A> {
fn generic_method<B>(self, _: B) -> &'static str {
fn_name::uninstantiated!()
}
}
fn main() {
assert_eq!(
GenericType(42u8).generic_method(false),
"GenericType<_>::generic_method"
);
}
The instantiated!
macro produces the name of the surrounding function or method, including instantiated generics (if any); e.g.:
struct GenericType<A>(A);
impl<A> GenericType<A> {
fn generic_method<B>(self, _: B) -> &'static str {
fn_name::instantiated!()
}
}
fn main() {
assert_eq!(
GenericType(42u8).generic_method(false),
"GenericType<u8>::generic_method<bool>"
);
}
The expansion of these macros is not (yet) const evaluable; their implementations rely on core::any::type_name
, which is not a const fn
.