如何将一个或多个 SemanticRules 与 scalafix 一起使用,类似于 scalameta 的 Transformer?

Posted

技术标签:

【中文标题】如何将一个或多个 SemanticRules 与 scalafix 一起使用,类似于 scalameta 的 Transformer?【英文标题】:How to use one or multiple SemanticRules with scalafix similar to scalameta's Transformer? 【发布时间】:2019-12-15 21:22:12 【问题描述】:

在教程https://scalacenter.github.io/scalafix/docs/developers/tutorial.html 中,我看到了如何为scalafix 实现SemanticRule。 我想直接在我从磁盘读取的 Scala 文件的源代码中调用它并转换文件。

在 scalameta 中,我可以执行以下操作:

val f = .... // some File
val path = f.toPath
val bytes = java.nio.file.Files.readAllBytes(path)
val text = new String(bytes, "UTF-8")
val input = Input.VirtualFile(path.toString, text)
val source = input.parse[Source].get
val transformer = new MyTransformer()
val transformedSource = transformer(source)
// The transformed source can be written into an output file

我想对 scalafix 做同样的事情,但使用 SemanticRule。 如果我读到这个:https://scalacenter.github.io/scalafix/docs/developers/tutorial.html#run-the-rule-from-source-code 它只向我展示了如何使用 Scala 规则文件的文件路径启动 scalafix 程序,但这不是我想要的。

【问题讨论】:

【参考方案1】:

我知道的唯一方法是使用规则的文件路径,如果它在单个文件中并且没有外部依赖项,或者以其他方式发布它。

使用 Scalafix 生成代码的示例项目是

https://github.com/olafurpg/scalafix-codegen

https://github.com/DmytroMitin/scalafix-codegen

【讨论】:

因此,如果我有多个要检测的文件并且它们具有语义数据库文件,我不应该使用 scalafix 单独转换它们吗?如果文件中的类实现了来自外部库(如 akka.Actor)的特征,我还能从单个编译源文件的语义数据库文件中获取此类型信息吗? @Baradé 我说的是规则(子项目rules),而不是代码生成的输入源(子项目in)。一切都可以是多文件并具有外部依赖关系。仅对于这种情况下的规则,它们应该被发布以供使用(例如sbt publishLocal)。 in 中的源可以是多文件,并且具有依赖性而不会出现问题。我猜你会发现像akka/Actor#akka/Actor. 这样的符号。 @Baradé 我有一个小型库,我在其中使用 Scalameta 和 Scalafix 进行代码生成github.com/DmytroMitin/AUXify

以上是关于如何将一个或多个 SemanticRules 与 scalafix 一起使用,类似于 scalameta 的 Transformer?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?

如何与多个 Android 设备共享文件?

如何将多个与 Vue 捆绑在一起

PyQt 和 QML:如何在一个插槽或函数中处理多个信号

如何将 set_clip_path() 与多个多边形一起使用?

将两个或多个 Canvas 元素与某种混合相结合