derive procedural macro 作用于 derive 属性。调用方式如 #[derive(TlbormDerive)]

简单的结构如下:

#[proc_macro_derive(MyDerive)]
pub fn my_derive(annotated_item: TokenStream) -> TokenStream {
    TokenStream::new()
}

输入的 token stream 为 derive 属性所绑定的项,这些项一般为 enumstruct 或者 union

使用例子:

use tlborm_proc::TlbormDerive;
 
#[derive(TlbormDerive)]
struct Foo;

Helper Attributes

derive proc macro 的特殊之处在于额可以添加额外的属性,这个属性只有项定义的范围才可见。这些属性称之为 derive macro helper attributes。这些属性的目的是给 derive proc macro 提供针对每个 field 或者 variant 的可定制性。helper attributes 是 inert 的,所以在属性处理期间并不会被清除,因此对所有 macro 可见。

helper attribute 可以通过给 proc_macro_derive 属性添加 attributes(helper0, helper1, ..) 参数来定义,helper0helper1 这些标识符为 helper attribute 的名字。

带有 helper attribute 的 derive proc macro 结构如下:

use proc_macro::TokenStream;
 
#[proc_macro_derive(TlbormDerive, attributes(tlborm_helper))]
pub fn tlborm_derive(item: TokenStream) -> TokenStream {
    TokenStream::new()
}

使用示例:

use tlborm_proc::TlbormDerive;
 
#[derive(TlbormDerive)]
struct Foo {
    #[tlborm_helper]
    field: u32
}
 
#[derive(TlbormDerive)]
enum Bar {
    #[tlborm_helper]
    Variant { #[tlborm_helper] field: u32 }
}