有没有一种方法可以从文档中隐藏宏模式?

14
截至Rust 1.6.0版本,生成的文档隐藏了每个宏模式的实现:

macro implementation hidden

有没有办法在Cargo生成的文档中隐藏某些模式?
macro_rules! mc {
    // hide this entire pattern
    (@impl, $arg:expr) => { 42 + $arg };
    // but not this one
    ($arg:expr) => { mc!(@impl, $arg) };
}
2个回答

9
我想这是最优解决方案:
/// Not meant to be called directly
#[doc(hidden)]
#[macro_export]
macro_rules! hidden {
    ( $hidden_rule1:expr ) => { ... };
    ( $hidden_rule2:expr ) => { ... };
    ...
}

#[macro_export]
macro_rules! public {
    ( $public:expr ) => ( hidden!($public) );
}

这里使用了一个单独的hidden宏(可能需要公开),但它并不是文档的一部分。所有应该隐藏的规则都将被隐藏,而公开的规则将在public宏中显示,该宏是文档的一部分。


7
请注意,如果用户明确导入宏(#[macro_use(public)] extern crate ...),他们将会收到一个错误,并且还需要包含 hidden: #[macro_use(public, hidden)] extern crate... - Mike
我编写了一个属性宏来自动处理这个问题:https://crates.io/crates/clean-macro-docs - Benjy Wiener

2

一种选择是创建一个只包含公共函数的虚拟宏,并使用属性来选择rustdoc可以看到哪个函数:

/// Do a thing
///
/// ```
/// # extern crate my_crate;
/// # use my_crate::mc;
/// assert_eq!(mc!(58), 100);
/// ```
#[cfg(doc)]
#[macro_export]
macro_rules! mc {
    ($arg:expr) => { ... };
}

#[cfg(not(doc))]
#[macro_export]
macro_rules! mc {
    (@impl, $arg:expr) => { 42 + $arg };
    ($arg:expr) => { mc!(@impl, $arg) };
}

注意:仅当您不在内部使用宏时,此方法才有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接