You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试过程宏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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:52:09