如何在 Rust 过程宏中获取 impl 块的类型?
How do you get the type of an impl block in a Rust procedural macro?
我正在尝试编写一个可以应用于这样的 impl 块的 Rust 过程宏;
struct SomeStruct { }
#[my_macro]
impl SomeStruct { }
我正在使用 syn 和 quote 来解析和格式化宏中的 TokenStream
s。它看起来像这样:
#[proc_macro_attribute]
pub fn my_macro(meta: TokenStream, code: TokenStream) -> TokenStream {
let input = parse_macro_input!(code as ItemImpl);
// ...
TokenStream::from(quote!(#input))
}
有没有办法使用 syn 访问 impl 块的类型名称?我在 ItemImpl
中没有看到任何可以提供该信息的字段。
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>
其中只有一个包含单词 "type":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
}
]
}
}
)
我正在尝试编写一个可以应用于这样的 impl 块的 Rust 过程宏;
struct SomeStruct { }
#[my_macro]
impl SomeStruct { }
我正在使用 syn 和 quote 来解析和格式化宏中的 TokenStream
s。它看起来像这样:
#[proc_macro_attribute]
pub fn my_macro(meta: TokenStream, code: TokenStream) -> TokenStream {
let input = parse_macro_input!(code as ItemImpl);
// ...
TokenStream::from(quote!(#input))
}
有没有办法使用 syn 访问 impl 块的类型名称?我在 ItemImpl
中没有看到任何可以提供该信息的字段。
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>
其中只有一个包含单词 "type":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
}
]
}
}
)