Ste*_*ier 3 macros rust rust-proc-macros
我有一个TokenStream来自 Rust 函数的定义。我想用syn::parse(和.unrwap())解析它。但是,我不知道返回类型应该是什么:
let ast: ??? = syn::parse(token_stream_from_function_definition).unwrap();
Run Code Online (Sandbox Code Playgroud)
应该是什么类型ast?
该syn::parse函数尝试将 a 解析TokenStream为您期望的任何内容。正如文档所说:
将源代码的标记解析为选定的语法树节点。
它需要一个类型参数,您通常使用类型推断提供该参数。例如,如果您希望解析函数声明:
let fn_decl: syn::FnDecl = syn::parse(token_stream).unwrap();
Run Code Online (Sandbox Code Playgroud)
如果它无法解析fn声明,这将导致恐慌。
如果您不确切知道会发生什么,那么您可以更笼统,匹配一组可能性,然后检查您发现的内容。为可以出现在相同位置的语法组提供了一些枚举。例如,如果您正在解析上下文中的代码,您希望在同一级别上找到函数声明或其他一些声明,您可能需要解析 anItem然后匹配所有可能的项目类型:
use syn::Item;
let item: Item = syn::parse(token_stream).unwrap();
match item {
Item::Fn(fn_decl) => {}
Item::Mod(mod_item) => {}
Item::Struct(struct_item) => {}
Item::Enum(enum_item) => {}
_ => {}
}
Run Code Online (Sandbox Code Playgroud)
请注意,syn::Item有 18 个要匹配的变体,并且syn::Expr有 40 个!绝对值得缩小可能性并选择最适合您需求的类型来解析。您还可以考虑定义自己的类型,表示您希望找到的各种语法结构,然后syn::Parse手动实现特征。