Proc宏执行顺序
Proc macro execution order
我有一个 proc macro
看起来像这样:
#[proc_macro_attribute]
pub fn my_macro(_meta: CompilerTokenStream, input: CompilerTokenStream) -> CompilerTokenStream { //* bits of code */ }
然后我有一个derive macro
:
#[proc_macro_derive(Operations)]
pub fn operations(input: proc_macro::TokenStream) -> proc_macro::TokenStream { //* bits of code */ }
是否可以在属性一之后展开派生宏?
原因是我有一个箱子,里面有一些静态变量来跟踪数据。我需要读取 derive macro
中的数据(attribute macro
是作者)。
谢谢。
宏在语法树中从 outside-in 开始展开;对于属性,这意味着首先从最顶层的属性开始。所以,你应该按照这个顺序写属性得到你想要的效果:
#[my_macro]
#[derive(Operations)]
但是,您不应在宏包中使用静态变量来传递信息。它现在可以工作,但 Rust 编译器不承诺不缓存宏调用,运行 每个宏扩展在单独的 process/sandbox 中,或其他会破坏宏通信路径的此类更改。
我有一个 proc macro
看起来像这样:
#[proc_macro_attribute]
pub fn my_macro(_meta: CompilerTokenStream, input: CompilerTokenStream) -> CompilerTokenStream { //* bits of code */ }
然后我有一个derive macro
:
#[proc_macro_derive(Operations)]
pub fn operations(input: proc_macro::TokenStream) -> proc_macro::TokenStream { //* bits of code */ }
是否可以在属性一之后展开派生宏?
原因是我有一个箱子,里面有一些静态变量来跟踪数据。我需要读取 derive macro
中的数据(attribute macro
是作者)。
谢谢。
宏在语法树中从 outside-in 开始展开;对于属性,这意味着首先从最顶层的属性开始。所以,你应该按照这个顺序写属性得到你想要的效果:
#[my_macro]
#[derive(Operations)]
但是,您不应在宏包中使用静态变量来传递信息。它现在可以工作,但 Rust 编译器不承诺不缓存宏调用,运行 每个宏扩展在单独的 process/sandbox 中,或其他会破坏宏通信路径的此类更改。