2015-08-02 2 views
1

Представьте меня есть макрос аннотация аннотирования случая класса:макросов Scala, как получить дерево определенного класса

class message(`type`: String) extends StaticAnnotation { 
    def macroTransform(annottees: Any*) = macro message.impl 
} 

... 

@message("SearchReq") 
case class SearchReq(req: String) 

У меня есть MessageRegister объект, находящийся в другом пакете. В аннотации @message body message.impl Мне нужно добавить тип сообщения в регистр.

Я понятия не имею, как это сделать. Первое, что пришло в голову - получить дерево объекта MessageRegister и добавить код в его тело, которое выполняется во время выполнения. Следующая идея заключается в том, что как-то аннотация @message выполняется во время выполнения, и я просто выполняю MessageRegister.registerMessage (msg).

Как я могу решить эту проблему?

+0

Аналогичный вопрос: http://stackoverflow.com/questions/30555338/scala-macro-modify-object – Daryl

ответ

0

В настоящее время макросы не могут изменять что-либо за пределами их объема. Я имею в виду, что это возможно, но это: 1) требует глубокого знания внутренних компонентов компилятора, 2) скорее всего будет несовместимым даже в незначительных выпусках компилятора, 3), скорее всего, не будет работать надежно (потому что он сделает предположения о порядке компиляции).

Говоря о вызове MessageRegister.registerMessage(msg), вы можете сделать макрокоманду, чтобы генерировать этот кусок кода, является сопутствующим объектом SearchReq. Однако этот код не имеет гарантированного времени выполнения (потому что он будет вызываться только после того, как кто-то запускает конструктор объекта SearchReq), что означает, что он не будет надежным (опять же, предположения о порядке выполнения).

Смежные вопросы