2 个版本

0.0.2 2022 年 1 月 19 日
0.0.1 2022 年 1 月 19 日

#20 in #macro-expansion

MIT 许可证

6KB
95 代码行

inline-mod

宏展开时的内联模块!

注意

初始声明需要 相对于项目根目录path 属性,因为在稳定版本中,无法获取宏调用文件的位置。
每个具有路径属性的嵌套模块也将相对于项目根目录进行处理,尽管 这可能在未来的更新中改变
如果一个嵌套的非内联模块没有路径属性,则宏将尝试以 Rust 编译器相同的方式进行解析 - 相对于当前模块查找 module_name.rsmodule_name/mod.rs 文件。

为什么?

目前,即使在 nightly 版本中,即使可以在非内联模块上使用属性宏,也无法完成任何事情,因为项目在宏展开后会被内联。这个宏会为你内联模块,这样你就可以在非内联(甚至是嵌套)的模块上使用宏。

示例

// main.rs
use inline_mod::inline_mod;

inline_mod! {
	#[my_attr]
	#[path = "src/foo.rs"]
	mod foo;
}

// foo.rs
struct Bar(i32);

pub mod baz;

// foo/baz/mod.rs
pub struct Hi;

将展开为

#[my_attr]
mod foo {
	struct Bar(i32);

	pub mod baz {
		pub struct Hi;
	}
}

在执行 my_attr 之前。

依赖项

~1.5MB
~35K SLoC