• Gary Guo's avatar
    rust: macros: add `paste!` proc macro · 823d4737
    Gary Guo authored
    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 version 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: default avatarGary Guo <gary@garyguo.net>
    Reviewed-by: default avatarBjörn Roy Baron <bjorn3_gh@protonmail.com>
    Reviewed-by: default avatarBenno Lossin <benno.lossin@proton.me>
    Reviewed-by: default avatarAlice Ryhl <aliceryhl@google.com>
    Reviewed-by: default avatarMartin Rodriguez Reboredo <yakoyoku@gmail.com>
    Link: https://lore.kernel.org/r/20230628171108.1150742-1-gary@garyguo.net
    [ Added SPDX license identifier as discussed in the list and fixed typo. ]
    Signed-off-by: default avatarMiguel Ojeda <ojeda@kernel.org>
    823d4737
paste.rs 3.82 KB