Rust: Kommentare zu Makroerweiterungen

Erstellt am 19. Okt. 2016  ·  3Kommentare  ·  Quelle: 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);

In diesem trivialen Codebeispiel möchte der Benutzer eine Struktur über die Makroerweiterung erstellen und für jeden unterschiedlichen Makroaufruf einen eindeutigen Kommentar schreiben.
Dies bedeutet einen eindeutigen Kommentar für struct Foo und Bar, der derzeit im rust-Compiler beim Aktivieren nicht möglich ist:

#![warn(missing_docs)]

Mit folgenden Warnungen:

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

Dies funktioniert zwar offensichtlich:

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

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

Hilfreichster Kommentar

Das Problem scheint hier nicht gelöst zu sein. Wie schreibe ich Doc-Kommentare für Makros, die mit ident ?

Alle 3 Kommentare

Sie könnten einfach alle Attribute weiterleiten (doc-Kommentare sind #[doc] Attribute), aber da der Wiederholung von Attributen nicht direkt ein Ident folgen kann, muss die Syntax etwas geändert werden.

Beispiel (Spielplatz)

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

Das Benutzerforum ist ein guter Ort, um Fragen wie diese zu diskutieren. https://users.rust-lang.org/

Konkrete Fehlerberichte sind hier sehr willkommen, aber ich schließe dies, da es beantwortet wurde und weitere Diskussionen am besten im Benutzerforum sind.

Das Problem scheint hier nicht gelöst zu sein. Wie schreibe ich Doc-Kommentare für Makros, die mit ident ?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen