我如何引用在Scala宏中包含“this”?

时间:2012-09-18 01:58:54

标签: scala macros scala-2.10 scala-macros

从一个更大的例子中提取的以下宏应该创建一个只有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>"))

1 个答案:

答案 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中这将是固定的。