Scala宏返回一个空的AST

时间:2014-04-21 20:06:46

标签: scala macros

如果当前日期通过指定的FIXME(或TODO)日期,我创建了一个生成编译器警告(或错误)的简单宏。

Scala 2.10.4的宏实现(see here)使用了c.Expr[Any]返回类型,在2.11.0中它是一个返回c.Tree的白盒宏。

在任何一种情况下,分别返回c.Expr[Any](EmptyTree)EmptyTree都会返回一个值。假设以下调用宏,

def hi() {
  FIXME("2073/04/10: This will abort compilation if not fixed by 2073/04/10")
  println("hi")
}

编译生成以下内容,

def hi(): Unit = {
  (<empty>: scala.runtime.BoxedUnit);
  scala.this.Predef.println("hi")
};

在宏呼叫站点。是否可以生成以下内容:

def hi(): Unit = {
  scala.this.Predef.println("hi")
};

1 个答案:

答案 0 :(得分:2)

您可以考虑将可修复块作为宏的参数:

def hi = FIXME("...") {  println(...) }

比较编译器对elidable代码的作用:它除了“零”值,而不是空树。

https://github.com/scala/scala/blob/2.10.x/src/compiler/scala/tools/nsc/transform/UnCurry.scala#L515

您也可以考虑使用宏注释。