使用scala宏注释向对象添加额外特征
我在Scala 2.10.3上使用Macro Paradise。我有一个宏注释,试图在其中向对象添加特征,例如:使用scala宏注释向对象添加额外特征,scala,macros,scala-macros,scala-macro-paradise,Scala,Macros,Scala Macros,Scala Macro Paradise,我在Scala 2.10.3上使用Macro Paradise。我有一个宏注释,试图在其中向对象添加特征,例如: @MyAnnotation object Foo extends Bar {} 在扩展之后,我想要如下内容: object Foo extends Bar with Baz {} 其中,Baz是可在编译范围内访问的特征。使用宏paradise,我可以清晰地分解目标树: q"object $obj extends ..$bases { ..$body }" = tree 其中ba
@MyAnnotation
object Foo extends Bar {}
在扩展之后,我想要如下内容:
object Foo extends Bar with Baz {}
其中,Baz
是可在编译范围内访问的特征。使用宏paradise,我可以清晰地分解目标树:
q"object $obj extends ..$bases { ..$body }" = tree
其中bases保存Ident表单列表中的现有扩展名(newTypeName(“Bar”))
我可以只在base中添加一个额外的Baz
条目并重建树,问题是目标可能“已经”包含Baz
。在这种情况下,我不想添加它。给我的术语名称缩短了。有没有办法将它们转换为宏中的实际类型引用
我在宏中尝试了以下操作:c.typeCheck(Ident(newTypeName(“Baz”))
,但出现以下错误:
scala.reflect.macros.TypeCheckException: trait some.Baz is not a value
我已经通读了上下文,看看是否还有其他明显的方法可以使用,但没有一个会跳出来
感谢您的帮助 在Scala 2.10中,c.typeCheck总是将其参数视为一个术语,您需要额外检查表示类型的树
这个答案解释了一种将某物作为类型进行类型检查的解决方法,并概述了宏注释特有的限制:。因此,在我的示例中,对象Foo位于另一个对象内部,比如调用对象Outer。当我尝试c.typeCheck(Block(annottees.head.tree.duplicate))时,我得到了一个非法的循环引用错误。它会拉入包含对象,从而再次拉入自身。有没有办法使用当前上下文将Baz解析为某些.Baz?从返回的错误判断,它一定是在内部执行的。您能在github上发布您的代码示例吗?我会尽力帮忙的。