了解SCALA的最佳代码迁移工具

154 阅读3分钟

简介

有了Scalafix,你可以专注于真正值得你花时间和精力去做的修改,而不是去处理简单、重复、乏味的代码转换。Scalafix是Scala最好的代码迁移工具,它可以将源文件中不支持的功能转化为较新的替代品,并将结果写回原始源文件。Scalafix在某些情况下可能无法进行自动迁移。当这种情况发生时,Scalafix会提供如何重构代码的说明,并指出违规的源代码行。有了新的Scala版本,你就能为你现有的Scala代码库更快地启动和运行。

Scalafix和Scala 2

Scala 2.13仍在计划中,所以我们不知道它到底会包括哪些语言变化。但是在Scalafix的帮助下,我们可以很容易地迁移我们现有的代码,而且以前被认为破坏性太大,因为需要手工更新太多的代码的变化也可能成为可能。可能的例子包括。

我们可以重写代码,以避免使用现在不受欢迎的language.postfixOps语法
废弃any2StringAdd,改用字符串插值
废弃过程语法,如Dotty
对Scala集合API进行了修改

Scalafix和Dotty

Dotty的新特性包括更快的编译时间,更快+更小的二进制文件,以及很棒的错误信息。由于Dotty的一些突破性变化,一些Scala 2.x应用程序不能立即利用这些优势。我们使用Scalafix来简化这些应用程序的迁移过程。

scalafix到底是做什么的?

Scalafix有一个命令行界面,也有一个SBT插件。运行scalafix非常简单。

# CLI
scalafix Code.scala

# SBT, after adding plugin to project/plugins.sbt
sbt scalafix

在这个初始版本中,ProcedureSyntax和VolatileLazyVal已经被重写了。

ProcedureSyntax 的重写工作是这样的。

// before
def main(args: Seq[String]) { // note lack of '='
  println("Hello scalafix!")
}
// after
def main(args: Seq[String]): Unit = { // note ': Unit ='
  println("Hello scalafix!")
}

为了简化Scala语言,程序语法正在被废弃或放弃。

VolatileLazyVal 的重写将Dotty的@volatile 注解加入到懒惰变量中,就像这样的事情。

lazy val x = ... // before

@volatile lazy val x = ... // after

Dotty使用@volatile实现了一个无死锁的方案,与Scalac的方案相当,甚至更快。

scalafix是如何工作的?

Scalafix是使用scala.meta构建的,scala.meta是一个即将到来的元编程工具包,旨在继承scala.reflect.Scala.meta使得在保留原始源文件的句法细节的同时,非常容易进行非难的代码转换。scala.meta的关键属性也使得它既适用于scalafix这样的开发者工具,也适用于宏这样的编译时元程序。

总结

元程序通过提供一个与平台无关的API,可以在Scala编译器、Dotty和IntelliJ IDEA等工具中使用,从而摆脱了编译器的实现。开发人员从建立在不可变的ADT和类型类上的直观用户界面中获益。编译器作者也能从中受益,因为他们不需要为了支持像宏这样的流行功能而暴露编译器的内部结构。