我有一个文件 src/main/scala/foo.scala
需要在包 bar
中。理想情况下,该文件应位于 src/main/scala/bar/foo.scala
中。
// src/main/scala/foo.scala
package bar
// ...
如何在整个项目中自动修复此问题,使文件夹结构与包结构匹配?
是否有任何 SBT 插件等可以帮助我解决此问题?
最佳答案
据我所知,没有这样的工具,尽管 AFAIR IntelliJ 可以警告包目录不匹配。
如果是自定义 scalafix ( https://scalacenter.github.io/scalafix/ ) 规则,我能想到的最好 - scalafix/scalameta 将用于检查文件的实际包,将其转换为预期目录,如果它们不同,则移动文件。
我建议使用 scalafix/scalameta,因为有一些特殊情况,例如:
你可以这样写你的包:
package a package b package c
它几乎像
package a.b.c
除了它会自动从a
导入所有内容和b
你可以拥有
package object
在你的文件中,然后如果你有
package a.b
package object c
这个文件应该在a/b/c
目录
所以我更愿意检查文件是否不属于使用某些现有工具的任何文件。
如果你确定你没有这样的情况(我不会不检查)你可以:
- 用正则表达式匹配第一行 (
^package (.*)
) - 翻译
a.b.c
进入a/b/c
(matched.split('.').map(_.trim).mkString(File.separator)
) - 将生成的位置与实际位置进行比较(我建议解析绝对文件位置)
- 必要时移动文件
如果可能有比这更复杂的情况,我可以通过查询 scalafix/scalameta 实用程序来替换第一步。
关于scala - 基于scala中包的自动修复目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61693510/