进程宏执行顺序



我有一个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 */ }

是否有可能使派生宏在属性1之后展开?

原因是我有一个带有一些静态变量的板条箱来跟踪数据。我需要读取derive macro中的数据(attribute macro是写入器)

宏在语法树中从向外展开;对于属性,这意味着首先从最上面的属性开始。因此,您应该通过按以下顺序编写属性来获得您想要的效果:

#[my_macro]
#[derive(Operations)]
但是,您不应该在宏crate中使用静态变量来传递信息。它现在可以工作,但是Rust编译器不承诺不缓存宏调用,在单独的进程/沙箱中运行每个宏扩展,或者其他会破坏宏通信路径的更改。

最新更新