我正在为我使用的编辑器编写一个 Scala 插件,它会突出显示所有未使用的代码路径(可能是未使用defs
的 、和) vals
,并为用户提供将它们从文件中拉出的选项。classes
implicits
.scala
我怎样才能做到这一点?为了简化问题,假设我们只有一个根级.scala
文件,没有外部依赖库或任何其他代码文件。
理想情况下,我希望这是一个 SBT 插件,给定一个这样的Foo.scala
文件,它会吐出Foo_min.Scala
文件并删除所有未使用的代码。
我正在为我使用的编辑器编写一个 Scala 插件,它会突出显示所有未使用的代码路径(可能是未使用defs
的 、和) vals
,并为用户提供将它们从文件中拉出的选项。classes
implicits
.scala
我怎样才能做到这一点?为了简化问题,假设我们只有一个根级.scala
文件,没有外部依赖库或任何其他代码文件。
理想情况下,我希望这是一个 SBT 插件,给定一个这样的Foo.scala
文件,它会吐出Foo_min.Scala
文件并删除所有未使用的代码。
您需要某种语义 API 来遍历代码并提出诸如“这个变量/导入是否曾经使用过”之类的问题?
据我所知,Intellij 用于Meta programming System
实现相同的目标。对于 scala,您可以等待scalameta
2.0 版本,它(很可能)将支持语义 API。
Scalafix 对此进行了重写:RemoveUnusedImports
按照这些说明运行它:https ://scalacenter.github.io/scalafix/#Installation
您基本上是在寻找callgraph。
一个完整但复杂的 Scala 代码调用图在Dotty Linker中实现。这是最先进的。然而,即使构建一个更简单的调用图也不是一件容易的事。如果 Meta 实现被限制执行这样的任务,我不会感到惊讶。特别是,您需要非常小心implicits和scoping,特别是考虑到元宏在typer 之后扩展的事实。
创建自己的调用图需要符号、类型和隐式搜索。恐怕您需要等到 Scala Meta 2.0 中的语义 API 发布。