如何用 scalameta 递归替换 AST 中的所有特定 Term.Name 表达式



我想替换 AST 中特定 Term.Name 实例的所有出现。像这样:

tree match {
    case t @ Term.Name(n) if (n == "bla") => Term.Apply(Term.Select(t, Term.Name("read")), List())
}

但是,为了实现这一点,我必须检查所有不同类型的语句等,并在这些语句中检查该术语。有没有更简单的方法来替换特定术语的所有出现?

尝试使用Transformer

import scala.meta._
val transformer = new Transformer {
  override def apply(tree: Tree): Tree = tree match {
    case t @ Term.Name(n) if (n == "bla") => Term.Apply(Term.Select(t, Term.Name("read")), List())
    case node => super.apply(node)
  }
}
transformer(tree)

https://scalameta.org/docs/trees/guide.html#custom-transformations

最新更新