我正在使用scalafix库尝试将项目从scalaz转换为cat,但有一次删除导入的尝试(以下代码中的第一种情况)失败了。相关的代码位为:
scalafix代码:
package fix
import scala.meta._
import scalafix.v1._
class MigrateList extends SemanticRule("MigrateList") {
private lazy val std = SymbolMatcher.normalized("scalaz.std.list")
private lazy val syntax = SymbolMatcher.normalized("scalaz.syntax.std.list")
override def fix(implicit doc: SemanticDocument): Patch =
doc.tree.collect {
case Importer(
syntax(_),
List(ip @ Importee.Name(Name("ToListOpsFromList"))),
) =>
Patch.removeImportee(ip)
case Importer(
std(_),
List(ip @ Importee.Name(Name("listInstance"))),
) =>
Patch.removeImportee(ip)
}.asPatch
}
输入文件:
package fix
import scalaz.std.list.listInstance
import scalaz.syntax.std.list.ToListOpsFromList
object MigrateList {}
预期输出:
package fix
object MigrateList {}
实际输出:
package fix
import scalaz.syntax.std.list.ToListOpsFromList
object MigrateList {}
问题出在模式的syntax(_)
部分。将其替换为通配符将导致匹配成功并删除导入
打印匹配时的值显示scalaz.syntax.std.list
。用替换图案
Term.Select(
Term.Select(
Term.Select(Name("scalaz"), Name("syntax")),
Name("std"),
),
Name("list"),
)
也有效,所以我很确定我正在尝试匹配正确的东西,只是在某种程度上使用了错误的SymbolMatcher。
我的错误是假设树及其相关符号的结构相同,只是符号添加了元数据
实际上,AST和我使用的是一样的,但当SymbolMatcher
运行其unapply
时,它发现对于语法导入,它们的路径实际上得到了"已解决";通过CCD_ 5。