如何将一个或多个 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 的不同订阅)一起使用?