测试过程宏Crate触发panic:在过程宏外调用过程宏API
解决非过程宏环境下使用syn的panic问题
直接使用proc_macro::TokenStream会触发panic,因为这个类型仅允许在过程宏的编译上下文中使用,普通二进制或库项目无法直接实例化它。
解决方法是改用proc_macro2::TokenStream——这是proc_macro::TokenStream的兼容替代实现,支持在非过程宏环境下正常工作。
修改后的代码示例:
use quote::quote; use syn::parse::Parser; use syn::punctuated::Punctuated; // 引入proc_macro2的TokenStream use proc_macro2::TokenStream; fn main() { // 生成proc_macro2的TokenStream,而非proc_macro的 let foo: TokenStream = quote!(Bar, Bazz).into(); // 使用parse_terminated解析,处理结果 match Punctuated::<syn::Ident, syn::Token![,]>::parse_terminated.parse(foo) { Ok(parsed) => { println!("解析成功:"); for ident in parsed { println!("{}", ident); } } Err(e) => println!("解析失败:{}", e), } }
关键说明:
proc_macro2是syn和quote生态的标准依赖,无需额外添加(通常随syn/quote自动引入)- 所有syn的解析API都支持接收
proc_macro2::TokenStream作为输入 - 若需要在过程宏代码和测试代码间复用解析逻辑,用
proc_macro2可以保持代码一致性
内容的提问来源于stack exchange,提问作者Pete Hayman
相关产品推荐
相关产品推荐

