过程宏可以作为函数进行调试吗?
Can a procedural macro be debugged as a function?
我正在尝试调试我正在使用的库中的复杂程序宏。
由于我不能使用带有宏的调试器,而且各种宏扩展工具在这里都被证明是无用的,所以我正在寻找替代方法。
程序宏可以 运行 像经过适当调试的函数一样吗?我想象将结果 proc_macro::TokenStream
存储在一个变量中。
proc-macro2
crate 是 proc_macro
的 drop-in 替代品,除了它在宏之外可用 - 这使得它可以测试。它的类型都可以与 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();
我正在尝试调试我正在使用的库中的复杂程序宏。
由于我不能使用带有宏的调试器,而且各种宏扩展工具在这里都被证明是无用的,所以我正在寻找替代方法。
程序宏可以 运行 像经过适当调试的函数一样吗?我想象将结果 proc_macro::TokenStream
存储在一个变量中。
proc-macro2
crate 是 proc_macro
的 drop-in 替代品,除了它在宏之外可用 - 这使得它可以测试。它的类型都可以与 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();