在 Rust 中解析属性宏参数

Parsing Attribute Macro Arguments in Rust

我正在编写属性宏并尝试解析传递到那里的参数。

喜欢:#[macro(Arg1, Arg2)]

问题是我找不到正确的结构来解析它。我尝试将其解析为 Meta 和 MetaList,但其中 none 似乎有效。

pub fn some_macro(args: TokenStream, item: TokenStream) -> TokenStream {
let args_parsed = parse_macro_input!(args as MetaList);

////////

let args_parsed = parse_macro_input!(args as Meta);

}

当我将它解析为 MetaList 时,我得到:意外的输入结束,预期的括号错误。

如有任何帮助,我们将不胜感激。

我假设您使用 syn 箱子。


Proc 宏没有将它们的参数作为元数据获取,但是在剥离 #[name(...)] 之后。也就是说,args 将包含 Arg1, Arg2 而不是 #[macro(Arg1, Arg2)],这是 Meta(和 MetaList)所期望的。

你要的是Punctuated:

// Note that I put `syn::Path` but you can put whatever you want to parse between the commas.
// For example `syn::NestedMeta` if you want the full attribute syntax.
let args_parsed = syn::punctuated::Punctuated::<syn::Path, syn::Token![,]>::parse_terminated
    .parse(args)
    .unwrap(); // Better to turn it into a `compile_error!()`