首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala SymbolMatcher未能匹配导入前缀

Scala SymbolMatcher未能匹配导入前缀
EN

Stack Overflow用户
提问于 2022-06-27 17:35:21
回答 1查看 69关注 0票数 1

我正在使用scalafix库尝试将一个项目从scalaz转换为cat,但是删除导入的一个特别尝试(以下代码中的第一个例子)失败了。相关的代码位数是:

标量修正代码:

代码语言:javascript
复制
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
}

输入文件:

代码语言:javascript
复制
package fix

import scalaz.std.list.listInstance
import scalaz.syntax.std.list.ToListOpsFromList

object MigrateList {}

预期产出:

代码语言:javascript
复制
package fix

object MigrateList {}

实际产出:

代码语言:javascript
复制
package fix

import scalaz.syntax.std.list.ToListOpsFromList

object MigrateList {}

正是模式的syntax(_)部分才是问题所在。将其替换为通配符将导致匹配成功并删除导入。

打印与之匹配的内容的值时显示scalaz.syntax.std.list。将模式替换为

代码语言:javascript
复制
Term.Select(
  Term.Select(
    Term.Select(Name("scalaz"), Name("syntax")),
    Name("std"),
  ),
  Name("list"),
)

同样有效,所以我很确定我试图匹配正确的东西,只是以某种方式使用SymbolMatcher错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-30 16:13:05

我的错误是假设树及其相关的符号是以相同的方式构造的,符号只是简单地添加元数据。

实际上,AST与我所使用的相同,但是当SymbolMatcher运行其unapply时,它会发现对于语法导入,它们的路径实际上通过scalaz.syntax.std.package.list得到“解析”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72776215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档