我正在使用scalafix库尝试将一个项目从scalaz转换为cat,但是删除导入的一个特别尝试(以下代码中的第一个例子)失败了。相关的代码位数是:
标量修正代码:
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错误。
发布于 2022-06-30 16:13:05
我的错误是假设树及其相关的符号是以相同的方式构造的,符号只是简单地添加元数据。
实际上,AST与我所使用的相同,但是当SymbolMatcher运行其unapply时,它会发现对于语法导入,它们的路径实际上通过scalaz.syntax.std.package.list得到“解析”。
https://stackoverflow.com/questions/72776215
复制相似问题