5个版本
0.1.4 | 2023年8月8日 |
---|---|
0.1.3 | 2023年3月19日 |
0.1.2 | 2023年3月18日 |
0.1.1 | 2023年3月12日 |
0.1.0 | 2023年3月11日 |
1596 在 过程宏 中
每月52次 下载
用于 5 个crate(直接使用2个)
9KB
115 行
macro-v
此crate提供了一种属性宏,用于使macro_rules!
宏的可见性与其他项相同。
声明宏的可见性与Rust中其他项目的行为不一致,这需要使用#[macro_use]
和#[macro_export]
而不是pub
或pub(...)
,这些不一致性使得心理负担和认知成本很大。现在有了这个crate,你可以使用#[macro_v]
或#[macro_v(pub)]
或#[macro_v(pub(...))]
在任何macro_rules!
宏上,使声明宏具有与其他项目相同的可见性,不再需要编写令人困惑的#[macro_use]
和#[macro_export]
。
灵感
受到macro-vis的启发,甚至以它的一部分命名,但macro-vis
存在两个问题。
-
你需要添加
#![allow(uncommon_codepoints)]
。 -
修改后的宏在文档中显示为函数而不是宏。
为了解决这两个问题,我重新实现了一个属性宏。
它的工作原理
非常简单,请看代码
#[macro_v(pub(crate))]
macro_rules! example_macro { () => {}; }
... 将扩展为这个
#[doc(hidden)]
macro_rules! __example_macro_2228885075611141983 { () => {}; }
#[doc(inline)]
pub(crate) use __example_macro_2228885075611141983 as example_macro;
如果你使用#[macro_v(pub)]
,那么扩展后的代码将添加#[macro_export]
#[doc(hidden)]
#[macro_export]
macro_rules! __example_macro_2228885075611141983 { () => {}; }
#[doc(inline)]
pub use __example_macro_2228885075611141983 as example_macro;
局限性
由于使用了 #[doc(hidden)]
,在重新导出时必须使用 #[doc(inline)]
属性,否则重新导出的宏在文档中不可见。当使用 #[macro_v]
时,#[doc(inline)]
将自动添加,但如果你想要手动重新导出宏,你必须也手动添加 #[doc(inline)]
,这是唯一的问题。
依赖
~315–770KB
~19K SLoC