#visibility #macro-rules #attributes #items #pub #macro-use #macro-export

macro macro-v

属性宏,使macro_rules!宏的可见性与其他项相同

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过程宏

Download history 21/week @ 2024-03-11 7/week @ 2024-03-18 5/week @ 2024-03-25 24/week @ 2024-04-01 7/week @ 2024-04-08 1/week @ 2024-04-15 4/week @ 2024-05-13 14/week @ 2024-05-20 10/week @ 2024-05-27 10/week @ 2024-06-03 13/week @ 2024-06-10 14/week @ 2024-06-17 15/week @ 2024-06-24

每月52次 下载
用于 5 个crate(直接使用2个)

MIT/Apache

9KB
115

macro-v

Crates.io version docs.rs docs

此crate提供了一种属性宏,用于使macro_rules!宏的可见性与其他项相同。

声明宏的可见性与Rust中其他项目的行为不一致,这需要使用#[macro_use]#[macro_export]而不是pubpub(...),这些不一致性使得心理负担和认知成本很大。现在有了这个crate,你可以使用#[macro_v]#[macro_v(pub)]#[macro_v(pub(...))]在任何macro_rules!宏上,使声明宏具有与其他项目相同的可见性,不再需要编写令人困惑的#[macro_use]#[macro_export]

灵感

受到macro-vis的启发,甚至以它的一部分命名,但macro-vis存在两个问题。

  1. 你需要添加#![allow(uncommon_codepoints)]

  2. 修改后的宏在文档中显示为函数而不是宏。

为了解决这两个问题,我重新实现了一个属性宏。

它的工作原理

非常简单,请看代码

#[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