Есть ли способ "сделать макрос вещи" в атрибуте без процедурного макроса? - PullRequest
0 голосов
/ 11 июня 2019

В частности, я пытаюсь поместить вывод макроса в комментарий документа. Я был взволнован, что это именно то, что я хочу:

/// foo
///
#[doc="bar\n\nbaz"]
///
/// quux
struct Dummy;

Следующим шагом будет замена этой строки моим контентом. Согласно this , я не могу написать #[doc=my_content!()], а макросы атрибутов являются процедурными, поэтому для этого мне нужен еще один ящик, плюс (я думаю) мой контент может быть сгенерирован без необходимости какого-либо процедурного макроса особенности.

Есть ли способ как-то сделать это с "обычными макросами", или мне не повезло?

1 Ответ

0 голосов
/ 13 июня 2019

Ответ, кажется, нет.

Глядя на грамматику для атрибутов , кроме скобок, запятых и знаков равенства, атрибуты могут в конечном итоге содержать только литералы. Таким образом, на этом уровне Rust не позволяет больше.


Однако, инвертирование структуры делает что-то подобное, и клеть doc-comment делает это для комментариев в документации. Вместо вызова макроса из атрибута используйте макрос для создания атрибута; этот макрос не ограничивается только получением литералов *. Недостатком является то, что элемент, к которому должен применяться атрибут, должен быть частью вызова макроса. Так что это

#[doc=my_content!()]
struct Foo;

становится таким:

doc_comment!(
    my_content!(),
    struct Foo;
);

Определение макроса простое:

#[macro_export]
macro_rules! doc_comment {
    ($x:expr, $($tt:tt)*) => {
        #[doc = $x]
        $($tt)*
    };
}

(опущена ветвь исходного макроса , который не является частью шаблона ядра)

(спасибо Йонасу-Шлевинку за указание мне на это)


* за исключением этой последней части (получение макрокоманды в атрибут), ответ на связанный вопрос *1030* уже делает именно это.

...