假设我有一个宏注释,它注释了case类:
class message(`type`: String) extends StaticAnnotation {
def macroTransform(annottees: Any*) = macro message.impl
}
...
@message("SearchReq")
case class SearchReq(req: String)
我有位于另一个包中的MessageRegister对象。在注释@消息体message.impl
中,我需要在寄存器中添加消息类型。
我不知道该怎么做。首先想到的是获取MessageRegister对象的树,并将在运行时执行的代码添加到其主体中。下一个想法是@message注释以某种方式在运行时执行,我只是执行MessageRegister.registerMessage(msg)。
如何解决这个问题?
目前宏不可能修改其作用域之外的任何内容。我的意思是,这是可能的,但它:1)需要深入了解编译器的内部,2)很可能在编译器的小版本中不兼容,3)很可能不能健壮地工作(因为它会对编译顺序进行假设)。
说到调用MessageRegister.registerMessage(msg)
,你可以做一个宏注释来生成这段代码,它是SearchReq
的一个伴侣对象。然而,该代码没有保证执行时间(因为只有在有人触发SearchReq
对象的构造函数时才会调用它),这意味着它不会是健壮的(再次,关于执行顺序的假设)。