我正在尝试调试我正在使用的库中的复杂程序宏。
由于我无法将调试器与宏一起使用,并且各种宏扩展工具已被证明在这里毫无用处,因此我正在寻找替代方案。
程序宏可以像函数一样运行并进行适当的调试吗?我想象存储结果proc_macro::TokenStream
在一个变量中。
The proc-macro2 crate https://crates.io/crates/proc-macro2是一个简单的替代品proc_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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)