Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scala宏注释向对象添加额外特征_Scala_Macros_Scala Macros_Scala Macro Paradise - Fatal编程技术网

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

使用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

我在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
其中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上发布您的代码示例吗?我会尽力帮忙的。