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