Re: [PATCH] rust: macros: add `paste!` proc macro

From: Martin Rodriguez Reboredo
Date: Wed Jun 28 2023 - 20:52:32 EST


On 6/28/23 14:11, Gary Guo wrote:
This macro provides a flexible way to concatenated identifiers together
and it allows the resulting identifier to be used to declare new items,
which `concat_idents!` does not allow. It also allows identifiers to be
transformed before concatenated.

The `concat_idents!` example

let x_1 = 42;
let x_2 = concat_idents!(x, _1);
assert!(x_1 == x_2);

can be written with `paste!` macro like this:

let x_1 = 42;
let x_2 = paste!([<x _1>]);
assert!(x_1 == x_2);

However `paste!` macro is more flexible because it can be used to create
a new variable:

let x_1 = 42;
paste!(let [<x _2>] = [<x _1>];);
assert!(x_1 == x_2);

While this is not possible with `concat_idents!`.

This macro is similar to the `paste!` crate [1], but this is a fresh
implementation to avoid vendoring large amount of code directly. Also, I
have augmented it to provide a way to specify span of the resulting
token, allowing precise control.

For example, this code is broken because the variable is declared inside
the macro, so Rust macro hygiene rules prevents access from the outside:

macro_rules! m {
($id: ident) => {
// The resulting token has hygiene of the macro.
paste!(let [<$id>] = 1;)
}
}

m!(a);
let _ = a;

In this versionn of `paste!` macro I added a `span` modifier to allow
this:

macro_rules! m {
($id: ident) => {
// The resulting token has hygiene of `$id`.
paste!(let [<$id:span>] = 1;)
}
}

m!(a);
let _ = a;

Link: http://docs.rs/paste/ [1]
Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>
---
[...]

Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@xxxxxxxxx>