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

How to replace all specific Term.Name expressions in an AST recursively with scalameta?

我想替换 AST 中出现的所有特定 Term.Name 实例。 类似于:

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

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

尝试使用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