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.

Другие вопросы по тегам