Scala宏如何获得树的特定类



假设我有一个宏注释,它注释了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对象的构造函数时才会调用它),这意味着它不会是健壮的(再次,关于执行顺序的假设)。

相关内容

  • 没有找到相关文章

最新更新