scala 宏如何获取特定 class 的树

scala macros how to get tree of specific class

假设我有一个注释大小写的宏注释 class:

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) 需要深入了解编译器内部结构,2) 很可能在编译器的次要版本中不兼容,3) 很可能无法稳健地工作(因为它会对编译顺序做出假设).

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