2014-02-10 57 views
1

我使用Macro Paradise在Scala 2.10.3上。我在那里我想一个特征添加到对象宏注释,如:使用scala宏注释将额外特征添加到对象

@MyAnnotation 
object Foo extends Bar {} 

扩张后,我想是这样的:

object Foo extends Bar with Baz {} 

Baz是在编译的性状访问范围。使用微距天堂,我可以清晰地解构我的目标树:

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

其中基地拥有订货号(newTypeName(“酒吧”))的形式列出

我只需要添加一个额外的Baz进入现有的扩展基地和重建树,问题是目标可能“已经”包含Baz。在这种情况下,我不想添加它。给我的名字缩短了。有没有方法将它们转换为宏内的实际类型引用?

我试图在宏观以下几点:c.typeCheck(Ident(newTypeName("Baz"))),但我得到了以下错误:

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

我已经通过的背景下审视,看是否使用那里有其他任何明显的方法,但没有跳出。

任何帮助表示赞赏!

回答

1

在Scala 2.10中,c.typeCheck总是把它的参数作为一个术语来处理,并且你需要花费更多的时间去检查表示类型的树。

此答案解释了一种解决方法,以类型化类型并概述特定于宏注释的限制:Can't access Parent's Members while dealing with Macro Annotations

+0

所以在我的例子中,对象Foo在另一个对象内部,让我们说叫外部对象。当我尝试c.typeCheck(块(annottees.head.tree.duplicate))时,我得到一个非法的循环引用错误。它拉动包含的对象,因此再次拉动自己。 – user3293336

+0

有没有使用当前的上下文来解决巴兹some.Baz的方式?根据返回的错误判断,它必须在内部进行。 – user3293336

+0

你可以在github上发布你的代码示例吗?我会尽力帮忙。 –