有没有办法匹配 Rust 中的文档注释macro_rules
?
我有一个宏,它为一堆 C 常量生成一个枚举,这些常量bindgen
创建:
macro_rules! id_enum {
( enum $name:ident: $typ:ty { $( $enum_name:ident => $value:expr ),* , } ) => { ... }
}
我想用文档注释(///
注释)注释每个,但这要求我的宏与文档注释匹配。那可能吗?
有没有办法匹配 Rust 中的文档注释macro_rules
?
我有一个宏,它为一堆 C 常量生成一个枚举,这些常量bindgen
创建:
macro_rules! id_enum {
( enum $name:ident: $typ:ty { $( $enum_name:ident => $value:expr ),* , } ) => { ... }
}
我想用文档注释(///
注释)注释每个,但这要求我的宏与文档注释匹配。那可能吗?
文档注释被翻译成表单的属性
#[doc = "documentation text"]
并且可以以翻译形式匹配:
macro_rules! print_doc {
(#[doc = $doc:expr]) => {
pub fn foo() {
println!($doc);
}
}
}
print_doc!(
/// gloink
);
fn main() {
foo();
}
如果要以修改后的形式发出文档注释,则需要在宏中使用属性语法,如本答案中所述:
要将原始文档注释与您的注释连接起来,您可以使用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"));
}
}