使用 scala 宏注释向对象添加额外的特征



我在Scala 2.10.3上使用Macro Paradise。我有一个宏注释,我正在尝试在对象上添加特征,例如:

@MyAnnotation
object Foo extends Bar {}

扩展后,我想要这样的东西:

object Foo extends Bar with Baz {}

其中Baz是编译范围内可访问的特征。使用宏天堂,我可以干净地解构我的目标树:

q"object $obj extends ..$bases { ..$body }" = tree

其中 bases 以 List of Ident(newTypeName("Bar"))的形式保存现有扩展名

我可以向基地添加一个额外的Baz条目并重建树,问题是目标可能"已经"包含Baz.在这种情况下,我不想添加它。给我的术语名称被缩短了。有没有办法将它们转换为宏中的实际类型引用?

我在宏中尝试了以下内容:c.typeCheck(Ident(newTypeName("Baz")))但我收到以下错误:

scala.reflect.macros.TypeCheckException: trait some.Baz is not a value

我已经查看了上下文,看看是否有任何其他明显的方法可以使用,但没有一个跳出来。

任何帮助表示赞赏!

在 Scala 2.10 中,c.typeCheck 总是将其参数视为一个术语,你需要加倍努力来类型检查表示类型的树。

此答案解释了将某些内容作为类型进行类型检查的解决方法,并概述了特定于宏注释的限制:在处理宏注释时无法访问父级成员。

最新更新