如何在Rust过程宏中获取impl块的类型?

时间:2018-12-25 21:58:51

标签: rust rust-macros

我正在尝试编写一个Rust程序宏,该宏可以应用于这样的impl块;

@ComponentScan(basePackages = {"com.softarts.app.services", "com.softarts.app.models"})

我正在使用syn和quote来解析和格式化宏中的struct SomeStruct { } #[my_macro] impl SomeStruct { } 。看起来像这样:

TokenStream

有没有一种方法可以使用syn访问访问模块的类型名称?我没有在#[proc_macro_attribute] pub fn my_macro(meta: TokenStream, code: TokenStream) -> TokenStream { let input = parse_macro_input!(code as ItemImpl); // ... TokenStream::from(quote!(#input)) } 中看到任何可提供该信息的字段。

1 个答案:

答案 0 :(得分:1)

documentationItemImpl上列出了9个字段:

  1. attrs: Vec<Attribute>
  2. defaultness: Option<Default>
  3. unsafety: Option<Unsafe>
  4. impl_token: Impl
  5. generics: Generics
  6. trait_: Option<(Option<Bang>, Path, For)>
  7. self_ty: Box<Type>
  8. brace_token: Brace
  9. items: Vec<ImplItem>

其中只有一个其中包含“类型”一词:self_ty

use syn; // 0.15.23

fn example(input: syn::ItemImpl) {
    println!("{:#?}", input.self_ty);
}

fn main() {
    let code = syn::parse_str(
        r###"
        impl Foo {}
        "###,
    )
    .unwrap();

    example(code);
}
Path(
    TypePath {
        qself: None,
        path: Path {
            leading_colon: None,
            segments: [
                PathSegment {
                    ident: Ident(
                        Foo
                    ),
                    arguments: None
                }
            ]
        }
    }
)