宏只能访问作为输入提供的令牌,因此在一般情况下这通常是不可能的。
如果您准备将代码重组为模块,则可以编写一组可以像这样使用的宏:
#[exec_follow]
mod my_mod {
#[follow]
fn caller(){
return callee();
}
fn callee() {
... // some implementation
}
}
外部宏exec_follow将接收整个模块作为输入并重写对follow宏的调用以提供所需的信息。例如,exec_follow可以输出这个:
mod my_mod {
#[follow(source = r"mod my_mod {
#[follow]
fn caller(){
return callee();
}
fn callee() {
... // some implementation
}
}")]
fn caller() {
return callee();
}
fn callee() {
... // some implementation
}
}
这只有在所有项目都在同一个模块中声明时才有效,该模块需要是当前模块的子模块。
添加对内部属性作为宏的支持是一个未解决的问题,但它在稳定的 Rust 中尚不可用。这将使您可以#![exec_follow]在文件顶部使用,而不是添加嵌套模块。