程序宏可以作为函数进行调试吗?

Jon*_*ght 2 rust rust-macros rust-proc-macros

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

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

程序宏是否可以像经过适当调试的函数一样运行?我想象将结果存储proc_macro::TokenStream在一个变量中。

Pet*_*all 5

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
}
Run Code Online (Sandbox Code Playgroud)

通常从 from 导入项目,proc-macro2因此它们可以不加限定地使用,并且只使用完全限定名称 for proc_macro,因为您唯一使用它的时间是在入口点。通常将核心组件放在一个单独的库包中,它不依赖于proc_macro.


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

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