Не удается получить доступ к родительским элементам при работе с аннотациями макросов
Я как бы заблокирован следующей ( макрокомандой ) ситуацией. Предположим, у меня есть аннотация, называемая @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
:
- Код C ++ в файлах заголовков
- В чем разница между собственным кодом, машинным кодом и кодом сборки?
- Codesign API Dropbox не работает в Xcode 4.6.3: «Объект кода вообще не подписан»
- Завершение кода PHP NetBeans
- «CompanyName.Foo» - это «пространство имен», но используется как «тип»,
@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 ++, разделение кода
- Как получить «кодовое обозначение» gdb на OSX?
- Форматирование ReSharper: выравнивание равных операндов
- Как я могу тестировать графический интерфейс?
- Когда использовать утверждение и когда использовать исключение
- «Взаимодействие с пользователем не разрешено», пытаясь подписать приложение OSX с использованием кода
- Когда можно использовать обработку исключений для бизнес-логики?
- Отладчик Visual Studio - отображение целочисленных значений в шестнадцатеричном виде
Деревья, которые входят в аргументы макрокоманды, целенаправленно нетипизируются. Однако работает c.typeCheck(q"(??? :
предоставит недостающую информацию. Не забывайте duplicate
это дерево перед проверкой меток, потому что c.typeCheck
мутирует дерево на месте, что может быть нежелательным.
В случае, если оба родителя и ребенка объявлены в одной и той же области без верхнего уровня, будет проблема типаCheck, не видя родителя, поскольку c.typeCheck в макрокомандах выполняется в родительской лексической области, так что annotations не получают чтобы увидеть полуконструированные области. Сообщается о чем-то подобном: https://github.com/aztek/scala-workflow/issues/2#issuecomment-23947943 .
Решение об исключении текущей области из проверки типов не является окончательным. На этой неделе я подумаю немного больше о том, как макрокоманды должны взаимодействовать с охватывающими областями, и, вероятно, изменит ее, чтобы делать то, что вы хотели бы сделать. Я бы сейчас сделал изменения, но мне нужно убедиться, что от этого изменения не будет никакого безумного поведения.