Простой способ заменить имя термина в аст
У меня есть следующий код для:
@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
это простой метод, но если у меня есть большой метод со многими выражениями, каков самый простой способ заменить имя переменной (из x
в y
например)?
1 ответ
Решение
После некоторого расследования мне нужно использовать 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)