属性式过程宏

属性式过程宏定义了可添加到条目的的新外部属性。这种宏通过 #[attr]#[attr(…)] 方式调用,其中 是任意标记树。

一个属性式过程宏的简单框架如下所示:

use proc_macro::TokenStream;

#[proc_macro_attribute]
pub fn tlborm_attribute(input: TokenStream, annotated_item: TokenStream) -> TokenStream {
    annotated_item
}

这里需要注意的是,与其他两种过程宏不同,这种宏有两个输入参数,而不是一个。

  • 第一个参数是属性名称后面的带分隔符的标记树,不包括它周围的分隔符。如果只有属性名称(其后不带标记树,比如 #[attr]),则这个参数的值为空。
  • 第二个参数是添加了该过程宏属性的条目,但不包括该过程宏所定义的属性。因为这是一个 active 属性,在传递给过程宏之前,该属性将从条目中剥离出来。

返回的标记流将完全替换带被添加了该属性的条目。注意,不一定替换成单个条目,替换的结果可以是 0 或更多条目。

用法示例:

use tlborm_proc::tlborm_attribute;

#[tlborm_attribute]
fn foo() {}

#[tlborm_attribute(attributes are pretty handsome)]
fn bar() {}