9

以下宏是从一个更大的示例中提取的,它应该创建一个只有对 的引用的树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>")).

4

1 回答 1

10

有两种选择可以实现您想要的:

1)使用This(tpnme.EMPTY)。目前这不能编译,所以你必须使用它This(newTypeName("")),但在 RC1 中这将被修复。

2)使用This(c.enclosingClass.symbol.asModule.moduleClass)。目前这不起作用,因为https://issues.scala-lang.org/browse/SI-6394,但在 RC1 中这将得到修复。

于 2012-09-18T07:09:21.590 回答