Rust: Comentarios para macro expansiones

Creado en 19 oct. 2016  ·  3Comentarios  ·  Fuente: 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);

En esta muestra de código trivial, el usuario desea crear una estructura a través de la expansión de macro y escribir un comentario único para cada invocación de macro diferente.
Esto significa un comentario único para struct Foo y Bar que actualmente no es posible en el compilador rust cuando se habilita:

#![warn(missing_docs)]

Con las siguientes advertencias:

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)]
   |         ^^^^^^^^^^^^

Si bien esto obviamente funciona:

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

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

Comentario más útil

El problema aquí no parece estar resuelto. ¿Cómo escribir comentarios de documentos para macros que comienzan con ident ?

Todos 3 comentarios

Puede simplemente reenviar todos los atributos (los comentarios de documentos son #[doc] atributos), pero dado que la repetición de atributos no puede ser seguida directamente por un identificador, es necesario cambiar un poco la sintaxis.

Ejemplo (patio de recreo)

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() {
}

El foro de usuarios es un buen lugar para discutir cuestiones como esta. https://users.rust-lang.org/

Los informes de errores concretos son muy bienvenidos aquí, pero cerraré esto ya que se ha respondido y es mejor seguir hablando en el foro de usuarios.

El problema aquí no parece estar resuelto. ¿Cómo escribir comentarios de documentos para macros que comienzan con ident ?

¿Fue útil esta página
0 / 5 - 0 calificaciones