Scala SymbolMatcher не соответствует префиксу импорта
Я использую библиотеку scalafix, чтобы попытаться преобразовать проект из scalaz в Cats, но одна конкретная попытка удаления импорта (первый случай в следующем коде) не удалась. Соответствующие биты кода:
код скалафикса:
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.
1 ответ
Моя ошибка заключалась в том, что я предположил, что дерево и связанный с ним символ были структурированы одинаково, а символ просто добавлял метаданные.
На самом деле AST такой же, как и у меня, но когдаSymbolMatcher
управляет своимunapply
, он обнаруживает, что для импорта синтаксиса их путь фактически "разрешается" черезscalaz.syntax.std.package.list
.