从一个更大的例子中提取的以下宏应该创建一个只有this
引用的树:
def echoThisImpl(c:Context): c.Expr[Any] = {
import c.universe._
val selfTree = This(c.enclosingClass.symbol)
c.Expr[AnyRef](selfTree)
}
def echoThis: Any = macro CallMacro.echoThisImpl
但是打电话给echoThis
,例如
object Testing extends App {
val thisValue = CallMacro.echoThis
println(thisValue)
}
无法编译,并显示消息
[error] /home/rafael/dev/scala/goose/goose-macros/src/test/scala/Testing.scala:8: type mismatch;
[error] found : <noprefix>
[error] required: Any
[error] val thisValue = CallMacro.echoThis
如果我设置 -Ymacro-debug-lite 标志,则生成的树为This(newTermName("<local Testing>"))
。
答案 0 :(得分:10)
实现目标有两种选择:
1)使用This(tpnme.EMPTY)
。目前这不会编译,所以你必须使用This(newTypeName(""))
代替,但在RC1中这将是固定的。
2)使用This(c.enclosingClass.symbol.asModule.moduleClass)
。目前这不起作用,因为https://issues.scala-lang.org/browse/SI-6394,但在RC1中这将是固定的。