#macro #visibility #macro-rules #decl-macro #namespaced

macro macro_pub

为可见性作用域宏的 polyfill proc-macro

1 个不稳定版本

0.1.0 2022 年 4 月 15 日

#16 in #visibility

Download history 10/week @ 2024-03-11 13/week @ 2024-03-18 15/week @ 2024-03-25 47/week @ 2024-04-01 8/week @ 2024-04-08 6/week @ 2024-04-15 14/week @ 2024-04-22 7/week @ 2024-04-29 25/week @ 2024-05-06 10/week @ 2024-05-13 17/week @ 2024-05-20 12/week @ 2024-05-27 14/week @ 2024-06-03 18/week @ 2024-06-10 13/week @ 2024-06-17 11/week @ 2024-06-24

每月 57 次下载
4 个 crate 中使用 (通过 awaur)

MIT/Apache

19KB
243

#[macro_pub]#[macro_export] 的替代品,它为 macro_rules! 宏提供常规可见性规则。

如果您想让宏不具有全局公开的可见性,则可以在属性中使用 pub(in path) 语法,例如 #[macro_pub(crate)]

如何

如果您使用一个遗留的作用域宏,它“挂载”它到常规可见性,并可以从那时起作为一个常规项使用。所以当您写

#[macro_pub(crate)]
macro_rules! my_macro {
    () => {};
}

它扩展为类似

macro_rules! macro_impl_279137529572831871236407390024221977230_my_macro {
    () => {};
}
pub(crate) use macro_impl_279137529572831871236407390024221977230_my_macro
    as my_macro;

哈希是注解项的 TokenStream 的 XXH3 哈希,并包含在内以防止在宏命名空间中的名称冲突。

如果您没有指定 pub(in path) 限制,则您将获得一个全局可见的宏

#[macro_export]
#[doc(hidden)]
macro_rules! macro_impl_279137529572831871236407390024221977230_my_macro {
    () => {};
}
pub use macro_impl_279137529572831871236407390024221977230_my_macro
    as my_macro;

记录公开宏

不幸的是,实际的宏实现上的 #[doc(hidden)] 隐藏了任何附加到它的文档,将 #[doc(inline)] 应用于 use 只会使它也变得隐藏,并且无法附加文档。因此,在稳定版本中,您的宏将像重新导出一样包含在文档中

pub use macro_impl_279137529572831871236407390024221977230_my_macro
    as my_macro;

macro_impl_279137529572831871236407390024221977230_my_macro 不会进行记录。

如果您正在使用nightly版本,我们可以利用nightly版本中的功能来记录宏。为了在nightly版本中记录您的crate,#[macro_pub]需要#![cfg_attr(doc, feature(decl_macro, rustc_attrs))],然后输出

#[cfg(doc)]
#[rustc_macro_transparency = "semitransparent"]
pub macro my_macro {
    () => {},
}
#[cfg(not(doc))]
// the previous expansion

这使用了不稳定的新版“宏2.0”来定义宏,使用传统的macro_rules!规则,遵循正常的命名空间规则,并通过rustdoc进行清晰的文档记录。

macro_pub会自动检测您正在使用的rustc编译器,以确定是否可以以这种方式使用decl_macro和rustc_attrs。当这些功能不可避免地发生变化时,macro_pub会自动回退到稳定解决方案。另外,如果直接解决这个问题的方式得到稳定(例如,pub macro_rules!,该功能几乎与这个crate做完全相同的事情),macro_pub将更新以利用兼容的rustc版本。

示例

在一个具有pub(crate)可见性的模块中

#[macro_use]
extern crate macro_pub;

mod test {
    #[macro_pub(crate)]
    macro_rules! m {
        () => {};
    }
}

test::m!();

具有pub(self)可见性的,不能在模块外部访问

#[macro_use]
extern crate macro_pub;
# fn main() {}

mod test {
    #[macro_pub(self)]
    macro_rules! m {
        () => {};
    }
}

test::m!(); //~ ERROR

依赖项

~97KB