paste!() { /* proc-macro */ }Expand description
Paste identifiers together.
Within the paste! macro, identifiers inside [< and >] are concatenated together to form a
single identifier.
This is similar to the paste crate, but with pasting feature limited to identifiers and
literals (lifetimes and documentation strings are not supported). There is a difference in
supported modifiers as well.
§Example
macro_rules! pub_no_prefix {
    ($prefix:ident, $($newname:ident),+) => {
        kernel::macros::paste! {
            $(pub(crate) const $newname: u32 = [<$prefix $newname>];)+
        }
    };
}
pub_no_prefix!(
    binder_driver_return_protocol_,
    BR_OK,
    BR_ERROR,
    BR_TRANSACTION,
    BR_REPLY,
    BR_DEAD_REPLY,
    BR_TRANSACTION_COMPLETE,
    BR_INCREFS,
    BR_ACQUIRE,
    BR_RELEASE,
    BR_DECREFS,
    BR_NOOP,
    BR_SPAWN_LOOPER,
    BR_DEAD_BINDER,
    BR_CLEAR_DEATH_NOTIFICATION_DONE,
    BR_FAILED_REPLY
);
assert_eq!(BR_OK, binder_driver_return_protocol_BR_OK);§Modifiers
For each identifier, it is possible to attach one or multiple modifiers to it.
Currently supported modifiers are:
- span: change the span of concatenated identifier to the span of the specified token. By default the span of the- [< >]group is used.
- lower: change the identifier to lower case.
- upper: change the identifier to upper case.
macro_rules! pub_no_prefix {
    ($prefix:ident, $($newname:ident),+) => {
        kernel::macros::paste! {
            $(pub(crate) const fn [<$newname:lower:span>]() -> u32 { [<$prefix $newname:span>] })+
        }
    };
}
pub_no_prefix!(
    binder_driver_return_protocol_,
    BR_OK,
    BR_ERROR,
    BR_TRANSACTION,
    BR_REPLY,
    BR_DEAD_REPLY,
    BR_TRANSACTION_COMPLETE,
    BR_INCREFS,
    BR_ACQUIRE,
    BR_RELEASE,
    BR_DECREFS,
    BR_NOOP,
    BR_SPAWN_LOOPER,
    BR_DEAD_BINDER,
    BR_CLEAR_DEATH_NOTIFICATION_DONE,
    BR_FAILED_REPLY
);
assert_eq!(br_ok(), binder_driver_return_protocol_BR_OK);§Literals
Literals can also be concatenated with other identifiers:
macro_rules! create_numbered_fn {
    ($name:literal, $val:literal) => {
        kernel::macros::paste! {
            fn [<some_ $name _fn $val>]() -> u32 { $val }
        }
    };
}
create_numbered_fn!("foo", 100);
assert_eq!(some_foo_fn100(), 100)