我在使用Macro Paradise时使用Scala 2.10.3。我有一个宏注释,我试图在对象上添加一个特征,例如:
@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
我查看了上下文,看看是否有其他明显的方法可供使用,但没有一个跳出来。
任何帮助表示赞赏!
答案 0 :(得分:1)
在Scala 2.10中,c.typeCheck始终将其参数视为一个术语,您需要花费更多的时间来检查表示类型的树。
这个答案解释了将某些东西作为一种类型进行类型检查的解决方法,并概述了特定于宏注释的限制:Can't access Parent's Members while dealing with Macro Annotations。