gpt4 book ai didi

rust - 过程宏可以作为函数进行调试吗?

转载 作者:行者123 更新时间:2023-12-03 11:27:45 25 4
gpt4 key购买 nike

我正在尝试调试我正在使用的库中的复杂过程宏。

因为我不能使用带有宏的调试器,而且各种宏扩展工具在这里都被证明是无用的,所以我正在寻找替代方案。

通过适当的调试,过程宏能否像函数一样运行?我想象将生成的 proc_macro::TokenStream 存储在一个变量中。

最佳答案

proc-macro2 crateproc_macro 的替代品,除了它在宏之外可用 - 这使得它可测试。它的类型都可以与 proc_macro 类型相互转换,并且具有相同的方法。

编写重要宏的通常模式是仅将 proc_macro 用于入口点,并使用 proc-macro2 进行所有实际工作:

extern crate proc_macro;
use proc_macro2::TokenStream;

#[proc_macro]
pub fn my_macro(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let output = transform_stream(TokenStream::from(input));
proc_macro::TokenStream::from(output)
}

// A testable function!
fn transform_stream(input: TokenStream) -> TokenStream {
// actual work goes here
}

proc-macro2 中导入项目是很常见的,因此它们可以不合格地使用,并且只为 proc_macro 使用完全合格的名称,因为只有一次你会使用它在入口点。通常将核心组件放在一个单独的库箱中,它不依赖于 proc_macro


在测试中,您可以从字符串创建一个TokenStream:

use std::str::FromStr;
let ts = TokenStream::from_str("fn foo() {}").unwrap();

关于rust - 过程宏可以作为函数进行调试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63272964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com