我有一个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编译器不承诺不缓存宏调用,在单独的进程/沙箱中运行每个宏扩展,或者其他会破坏宏通信路径的更改。