如何将可见性令牌传递给位标志!宏观?

How to pass a visibility token to the bitflags! macro?

我正在使用 bitflags 箱子。我想为我的类型自动生成一些其他实现,所以我尝试从另一个宏调用 bitflags! 宏。在我希望能够处理可见性令牌之前,这一直很好用。

我尝试了以下代码。

Playground

use bitflags::bitflags;

macro_rules! my_bitflags {
    (
        $(#[$outer:meta])*
        $vis:vis struct $name:ident: $ty:ty {
            $(
                $(#[$inner:ident $($args:tt)*])*
                const $flag:ident = $value:expr;
            )+
        }
    ) => {
        bitflags! {
            $(#[$outer])*
            $vis struct $name: $ty {
                $(
                    $(#[$inner $($args)*])*
                    const $flag = $value;
                )+
            }
        }
        
        // other implementations on $name here
        // 
    }
}


my_bitflags! {
    pub struct Flags: u32 {
        const A = 0x1;
        const B = 0x2;
        const C = 0x4;
    }
}

我原以为这会起作用,但我收到以下错误

error: no rules expected the token `pub `

这是 bitflags! 宏的问题吗?或者我是否错误地传递了可见性令牌?

$visbitflags! is defined 中作为令牌树 (tt),而不是可见性 (vis)。可见性只是“最近”引入 rustc 并且 bitflags! 宏通过不重新定义 $vis.

保持 backward-compatible

您需要将 my_bitflags! 中的 $vis:vis 更改为 $vis:tt,以便它可以扩展为 bitflags!