Простой способ заменить имя термина в аст

У меня есть следующий код для:

@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)
Другие вопросы по тегам