Как получить информацию о признаке по его названию в процедурном макросе? - PullRequest
0 голосов
/ 14 апреля 2020

Я пишу процедурный макрос, который принимает имя признака и генерирует структуру нового типа, в которой хранится разработчик этого признака (T) и реализует признак, используя реализацию на T. По сути, эта структура нового типа изолирует одну черту объекта и «запечатывает внутри» реализации для всех других черт.

Для правильной работы макрос должен найти черту в области сайта вызова ( что легко сделать, ссылаясь на признак так же, как это делает вызов), сгенерировать имя для нового типа на основе имени признака (в моем случае, Only{trait_name}, например, OnlyDisplay), получить список методов и связанных функций / типов / констант в признаке и реализовать их с self.{method_name}({parameters}) (для методов) или Self::{assoc_name} для связанных членов. Этот шаг меня смущает: ни Синкрейт, ни proc_macro не предоставляют методов для определения черт по их Ident s и последующего внутреннего анализа.

Итак, как мне найти черту по Ident в текущем объеме и получить список всего в своем определении?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Краткий ответ: Вы не можете. К тому времени, когда исполняется pro c -macro, все, что знает компилятор, это токенизация источника; то есть он знает, что источник анализирует. Компилятор ничего не знает о типах, какие идентификаторы относятся к тому, что и как понимать любой из них.

Возможно, вы захотите обновить свой вопрос относительно того, каково ваше намерение : Что Вы на самом деле пытаетесь совершить sh?

1 голос
/ 14 апреля 2020

Вы не можете. Макросы раскрываются до того, как будет выполнен любой анализ semanti c, и имена не будут разрешены в этот момент.

Лучше всего сделать что-то вроде удаленный атрибут serde и повторить определение черты.

...