在ast中替换术语名称的简便方法

时间:2016-03-23 21:29:05

标签: scala scala-macros scala-macro-paradise

我有以下代码:

@compileTimeOnly("enable macro paradise to expand macro annotations")
class replace extends StaticAnnotation {
  def macroTransform(annottees: Any*) = macro replaceImpl.replace
}

object replaceImpl {
  def replace(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
    import c.universe._

    // ? 

    c.Expr[Any](q"")
  }
}

通过此代码,我想在下一个使用示例中替换变量名称(x):

@replace
def foo(x: Int) = x + 1 

它是一个简单的方法,但是如果我有一个包含很多表达式的大方法,那么替换变量名称的最简单方法是什么(例如从xy)?

1 个答案:

答案 0 :(得分:2)

经过一些调查,我需要使用Transfomer#transform方法,有些像这样:

val t = new Transformer {
  override def transform(tree: Tree) = {
    val nt = tree match {
      case Ident(x) => Ident(someNewName)
      case x => x
    }
    super.transform(newTree)
  }
}

// and then

val result = t.transform(inputTree)