2017-04-11 1 views
4

Je voudrais utiliser une variable macro dans la documentation générée par macro:Comment intégrer une variable de macro Rust dans la documentation?

macro_rules! impl_foo { 
    ($name:ident) => { 
     /// Returns a new `$name`. 
     fn myfoo() -> $name { 

     } 
    }; 
} 

Cependant, ne sera pas remplacé par la variable. J'ai aussi essayé d'utiliser l'attribut #[doc]:

macro_rules! impl_foo { 
    ($name:ident) => { 
     #[doc = concat!("Returns a new `", $name, "`.")] 
     fn myfoo() -> $name { 

     } 
    }; 
} 

Celui-ci échoue même à analyser: unexpected token: 'concat'

+0

@Shepmaster Je ne pouvais pas le trouver, mais je me demande pourquoi le second ne parvient pas à analyser. – torkleyy

+0

L'ensemble des jetons autorisés à l'intérieur d'un attribut est probablement assez limité. – Shepmaster

+1

@torkleyy Les macros ne sont pas développées lors de l'analyse (c'est pourquoi il y a [RFC 1628 "expansion des macros"] (https://github.com/rust-lang/rfcs/pull/1628)) – kennytm

Répondre

5

Pour autant que je sache, le mieux que vous pouvez faire nécessite des répétitions pour l'instant:

macro_rules! impl_foo { 
    ($name:ident, $sname:expr) => { 
     #[doc = "Returns a new `"] 
     #[doc = $sname] 
     #[doc = "`."] 
     fn myfoo() -> $name { 
      42 
     } 
    }; 
} 

impl_foo!(u32, "u32"); 

Ce qui rend comme:

Example from rustdoc

+0

Et certaines macros récursives avec 'tt' et l'utilisation de' stringify! 'Pourraient probablement supprimer la redondance. – Shepmaster

+1

Hélas j'ai essayé, mais je n'ai pas trouvé la bonne façon de le faire. – mcarton