Rust: Comentários para expansões macro

Criado em 19 out. 2016  ·  3Comentários  ·  Fonte: rust-lang/rust

macro_rules! foo_macro {
    ($name:ident) => {
        pub struct $name;
    }
}

/// Doc comment for Foo struct.
foo_macro!(Foo);

/// Doc comment for Bar struct.
foo_macro!(Bar);

Neste exemplo de código trivial, o usuário deseja criar uma estrutura por meio da expansão da macro e escrever um comentário exclusivo para cada chamada de macro diferente.
Isso significa um comentário exclusivo para struct Foo e Bar que atualmente não é possível no compilador de ferrugem ao habilitar:

#![warn(missing_docs)]

Com os seguintes avisos:

warning: missing documentation for a struct
  --> src/activation_fn.rs:9:3
   |
9  |        pub struct $name;
   |        ^^^^^^^^^^^^^^^^^
...
14 | foo_macro!(Foo);
   | ---------------- in this macro invocation
   |
note: lint level defined here
  --> src/lib.rs:1:9
   |
1  | #![warn(missing_docs)]
   |         ^^^^^^^^^^^^

warning: missing documentation for a struct
  --> src/activation_fn.rs:9:3
   |
9  |        pub struct $name;
   |        ^^^^^^^^^^^^^^^^^
...
17 | foo_macro!(Bar);
   | ---------------- in this macro invocation
   |
note: lint level defined here
  --> src/lib.rs:1:9
   |
1  | #![warn(missing_docs)]
   |         ^^^^^^^^^^^^

Embora isso obviamente funcione:

macro_rules! foo_macro {
    /// Unified comment for any macro expansion which is bad!
    ($name:ident) => {
        pub struct $name;
    }
}

foo_macro!(Foo);
foo_macro!(Bar);

Comentários muito úteis

O problema aqui parece não estar resolvido. Como escrever comentários de documento para macros que começam com ident ?

Todos 3 comentários

Você poderia simplesmente encaminhar todos os atributos (os comentários do documento são #[doc] atributos), mas como a repetição dos atributos não pode ser seguida diretamente por um ident, é necessário alterar um pouco a sintaxe.

Exemplo (playground)

macro_rules! foo_macro {
    ($(#[$attr:meta])* struct $name:ident) => {
        $(#[$attr])*
        pub struct $name;
    }
}

foo_macro!(
    /// Doc comment for Foo struct.
    struct Foo
);

foo_macro!(
    /// Doc comment for Bar struct.
    struct Bar
);

fn main() {
}

O fórum do usuário é um bom lugar para discutir questões como esta. https://users.rust-lang.org/

Relatórios de bugs concretos são muito bem-vindos aqui, mas irei encerrar assim que tiver sido respondido e discussões futuras são melhores no fórum do usuário.

O problema aqui parece não estar resolvido. Como escrever comentários de documento para macros que começam com ident ?

Esta página foi útil?
0 / 5 - 0 avaliações