Не удается получить доступ к родительским элементам при работе с аннотациями макросов

Я как бы заблокирован следующей ( макрокомандой ) ситуацией. Предположим, у меня есть аннотация, называемая @factory которая направлена ​​на создание метода apply для аннотированного признака в соответствующем сопутствующем объекте. Например, учитывая trait A :

 @factory trait A { val a1: Int } 

ожидаемый код, который должен быть сгенерирован, следующий:

 object A extends Factory[A] { def apply(_a1: Int) = new A { val a1 = _a1 } } 

Предположим теперь, что у нас есть черта B которая наследуется от A :

 @factory trait B extends A { val b1: String } 

который должен генерировать:

 object B extends Factory[B] { def apply(_a1: Int, _b1: String) = new B { val a1 = _a1 val b1 = _b1 } } 

В последнем случае мне нужно знать, какие атрибуты существуют в A , но я не знаю, как получить информацию о них . Имея дело с макрокомандами, я имею доступ только к признаку B AST (как ClassDef ). Хотя его template содержит ссылки на родителей (как TypeTrees ), оба поля tpe и symbol пусты.

Было бы здорово получить доступ к АСТ. Однако, я думаю, это невозможно. Поэтому любой символ или тип (указывающий либо на родительский, либо на текущий тип) будет достаточно хорошим.

Если вы хотите увидеть больше деталей реализации, я загрузил проект на https://github.com/jesuslopez-gonzalez/cool-factory . Он может генерировать apply для локальных значений.

Деревья, которые входят в аргументы макрокоманды, целенаправленно нетипизируются. Однако работает c.typeCheck(q"(??? : )").tpe предоставит недостающую информацию. Не забывайте duplicate это дерево перед проверкой меток, потому что c.typeCheck мутирует дерево на месте, что может быть нежелательным.

В случае, если оба родителя и ребенка объявлены в одной и той же области без верхнего уровня, будет проблема типаCheck, не видя родителя, поскольку c.typeCheck в макрокомандах выполняется в родительской лексической области, так что annotations не получают чтобы увидеть полуконструированные области. Сообщается о чем-то подобном: https://github.com/aztek/scala-workflow/issues/2#issuecomment-23947943 .

Решение об исключении текущей области из проверки типов не является окончательным. На этой неделе я подумаю немного больше о том, как макрокоманды должны взаимодействовать с охватывающими областями, и, вероятно, изменит ее, чтобы делать то, что вы хотели бы сделать. Я бы сейчас сделал изменения, но мне нужно убедиться, что от этого изменения не будет никакого безумного поведения.

  • Ошибка кодового знака: профиль Provisioning не найден.
  • Форматирование Литеральные параметры fragmentа кода C #
  • Что означает == $ 0 (double equals dollar zero) в инструментах разработчика Chrome?
  • Может ли class Java добавлять метод вовремя?
  • Проверка указателя NULL в C / C ++
  • Покрытие кода, не показывающее результаты с помощью Xcode + gcov
  • Отключение автоматического форматирования в Visual Studio
  • Как испускать и выполнять байт-код Java во время выполнения?
  • Генерировать различные случайные числа в C #
  • Можете ли вы создавать представления sql / хранимую процедуру с использованием Entity Framework 4.1 Первый подход к коду
  • Как определить неиспользуемые определения css
  • Давайте будем гением компьютера.