scala宏如何获取特定类的树

时间:2015-08-02 11:09:08

标签: scala reflection macros annotations scala-macros

想象一下,我有一个注释案例类的宏注释:

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)。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

宏目前无法修改其范围之外的任何内容。我的意思是,它是可能的,但它:1)需要深入了解编译器内部,2)很可能在编译器的次要版本中不兼容,3)很可能不能稳健地工作(因为它会使关于编译顺序的假设。)

说到调用MessageRegister.registerMessage(msg),你可以创建一个宏注释,生成这段代码是SearchReq的伴随对象。但是,该代码没有保证执行的时间(因为只有在有人触发SearchReq对象的构造函数时才会调用它),这意味着它不会很健壮(再次,关于执行顺序的假设。)