匹配文档注释的宏规则

Col*_*Two 3 rust rust-macros

有没有办法匹配 Rust 中的文档注释macro_rules

我有一个宏,可以为一堆 C 常量生成枚举,从而bindgen创建:

macro_rules! id_enum {
    ( enum $name:ident: $typ:ty { $( $enum_name:ident => $value:expr ),* , } ) => { ... }
}
Run Code Online (Sandbox Code Playgroud)

我想用文档注释(注释///)来注释每个宏,但这要求我的宏与文档注释匹配。那可能吗?

Sve*_*ach 6

文档注释被转换为表单的属性

#[doc = "documentation text"]
Run Code Online (Sandbox Code Playgroud)

并且可以匹配其翻译形式:

macro_rules! print_doc {
    (#[doc = $doc:expr]) => {
        pub fn foo() {
            println!($doc);
        }
    }
}

print_doc!(
    /// gloink
);

fn main() {
    foo();
}
Run Code Online (Sandbox Code Playgroud)

如果您想以修改后的形式发出文档注释,则需要在宏内使用属性语法,如本答案中所述:

concat!()要将原始文档注释与注释连接起来,您可以使用标准库中的宏。但是,属性内部不允许宏调用,因此您需要一个辅助宏,例如

macro_rules! annotated_func {
    ($doc:expr) => {
        #[doc = $doc]
        pub fn foo() {
            println!($doc);
        }
    }
}

macro_rules! print_doc {
    (#[doc = $doc:expr]) => {
        annotated_func!(concat!($doc, "\nannotation"));
    }
}
Run Code Online (Sandbox Code Playgroud)