我正在尝试编写一个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))
}
中看到任何可提供该信息的字段。
答案 0 :(得分:1)
documentation在ItemImpl
上列出了9个字段:
attrs: Vec<Attribute>
defaultness: Option<Default>
unsafety: Option<Unsafe>
impl_token: Impl
generics: Generics
trait_: Option<(Option<Bang>, Path, For)>
self_ty: Box<Type>
brace_token: Brace
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
}
]
}
}
)