如何为 syn::parse 找到正确的 return 类型?

How to find the correct return type for syn::parse?

我有一个来自 Rust 函数定义的 TokenStream。我想用 syn::parse(和 .unrwap())解析它。但是,我不知道 return 类型应该是什么:

let ast: ??? = syn::parse(token_stream_from_function_definition).unwrap();

ast 的类型应该是什么?

syn::parse 函数尝试将 TokenStream 解析为 期望的任何内容。正如文档所说:

Parse tokens of source code into the chosen syntax tree node.

它需要一个类型参数,您通常使用类型推断提供该参数。例如,如果您希望解析一个函数声明:

let fn_decl: syn::FnDecl = syn::parse(token_stream).unwrap();

如果它无法解析 fn 声明,这会出现恐慌。


如果您不确切知道会发生什么,那么您可以更笼统,匹配一组可能性,然后检查您找到的内容。为可以出现在相同位置的语法组提供了一些枚举。例如,如果您在希望在同一级别上找到函数声明 一些其他声明的上下文中解析代码,则可能需要解析 Item 和然后匹配所有可能的项目类型:

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) => {}
    _ => {}
}

请注意,syn::Item 有 18 个要匹配的变体,而 syn::Expr 有 40 个!绝对值得缩小可能性并选择要解析的类型,以最满足您的需求。您还可以考虑定义自己的类型,代表您希望找到的各种句法结构,然后手动实现 syn::Parse 特征。