Использование $crate в процедурных макросах Rust?

Я знаю, что такое переменная $crate, но, насколько я могу судить, ее нельзя использовать внутри процедурных макросов. Есть ли другой способ добиться подобного эффекта?

У меня есть пример, который примерно требует, чтобы я написал что-то вроде этого, используя цитаты и ночные Rust

quote!(
     struct Foo {
        bar: [SomeTrait;#len]
     }
)

Мне нужно убедиться, что SomeTrait находится в области видимости (#len ссылается на целое число вне области действия фрагмента).

Я использую процедурные макросы 2.0 по ночам, используя quote и syn, потому что proc-macro-hack у меня не работает. Это пример, который я пытаюсь обобщить.

Ответ 1

Судя по ответам с https://github.com/rust-lang/rust/issues/38356#issuecomment-412920528, похоже, что этого сделать нельзя (по состоянию на 2018-08), а также не ссылаться на протокол Макро-ящик, ни ссылаться на любой другой ящик однозначно.

Ответ 2

В Edition 2015 (классический Rust) вы можете сделать это (но это хакерство):

  • используйте ::defining_crate::SomeTrait в макросе
  • в сторонних ящиках, в зависимости от defining_crate, выше работает нормально
  • в пределах defining_crate себя добавьте модуль в корень:

    mod defining_crate { pub use super::*; }

В Выпуске 2018 требуются еще более хакерские решения (см. Эту проблему), хотя # 55275 может дать нам простой обходной путь.