Releases: scalacenter/scalafix
Scalafix v0.9.1
We are happy to announce the release of Scalafix v0.9.1. Scalafix is a refactoring and linting tool for Scala.
Better performance
Running Scalafix on large codebases can be up to 2x faster now. A benchmark running Scalafix on the Spark codebase (3.201 files; 103.181 lines) previously took ~50 seconds now takes ~25 seconds. For more details see #898. Big thanks to @marcelocenerine for this contribution!
Advanced regex disable
From #907
- Now error messages will underline the whole area of matched regex
- The relevant capture group can be specified, in case you have complicated regex's which may match on parts which aren't helpful in the error message
- scalafix errors which came from a regex match have access to the capture groups for substitution in the error messages.
Big thanks to @Jacoby6000 for this contribution!
Java 11
Scalafix now runs on Java 11. Our CI additionally runs the full build on Java 11 for every PR to prevent regressions.
Run published rules directly from the shell
Previously, you needed to declare scalafixDependencies
in build.sbt to run published rules.
// before: build.sbt
scalafixDependencies in ThisBuild += "org.http4s" %% "http4s-scalafix" % "0.20.0-M3"
Now it's possible to run published rules directly from the sbt shell without updating build.sbt
> scalafix dependency:Http4s018To029@org.http4s:http4s-scalafix:0.20.0-M3
Custom resolvers for published rules
Previously, sbt-scalafix required published custom rules to be available on Maven Central. Now it's possible to publish custom rules anywhere (for example Bintray) and resolve them by updating scalafixResolvers
in build.sbt. Big thanks to @kamilkloch for implementing this feature
Disable while loops
The new option DisableSyntax.noWhileLoops=true
will trigger Scalafix to error on the usage of while loops.
Improved error messages
PR #910 improved the reported messages for unexpected errors. Thanks to @raboof for reporting!
Contributors
$ git shortlog -sn --no-merges v0.9.0..v0.9.1
Jacob Barber
Ólafur Páll Geirsson
Kamil Kloch
Marcelo Cenerino
Scalafix v0.9.0
We are excited to announce the release of Scalafix v0.9.0. Scalafix is a refactoring and linting tool for Scala.
This release includes improvements to documentation, the sbt plugin, better semantic APIs, improved support for custom rules and more.
This release has been under development since January 2018 and includes contributions from 19 contributors. Big thanks to everybody who made it possible!
Documentation 📖
Scalafix has a new website https://scalacenter.github.io/scalafix/
- Rule author tutorial
- API reference overview in addition to dedicated pages for key components:
- Patch: to rewrite sources
- SymbolMatcher: to match interesting tree nodes
- SymbolInformation: to query metadata about symbols
- SemanticType: to inspect types of variables
- SemanticTree: to query inferred type parameters and implicits
- Improved sbt installation instructions
Scalameta v4.0 🔥
The Scalameta dependency has been upgraded to the newly released v4.0.0
- Release notes: https://github.com/scalameta/scalameta/releases/tag/v4.0.0
- New Scalameta docs: https://scalameta.org/
New Semantic API 🧙
Semantic rules can now perform more advanced code analysis thanks to improvements in the semantic API:
- Rules can look up symbol information for any symbol on the classpath, including dependencies. Previously, Scalafix only supported looking up information about symbols that were defined in the project.
- The SymbolInformation data structure (previously named
Denotation
) now includes richer information about the symbol's signature, annotations and visibility access. - Rules can inspect the SemanticType, which is a sealed data structure describing the type of variables and parameters. Previously, value signatures were represented as strings making them difficult to analyze.
- Rules can inspect SemanticTree, which is a sealed data structure describing synthetic code that is generated by the compiler from inferred type parameters, implicit arguments, implicit conversions and for comprehensions. Previously, synthetics were encoded as strings making them difficult to analyze.
The new Scalafix semantic API was made possible thanks to recent improvements in SemanticDB.
Improved sbt plugin 🛠
The sbt plugin has been overhauled to address issues with the previous plugin that were reported by our users. The new sbt plugin integrates directly with Scalafix library APIs resulting in an overall more polished user experience.
- The old
scalafix
,scalafixTest
andscalafixCli
tasks have been merged into a single task:scalafix
.scalafixTest
is nowscalafix --check
scalafix
continues to work as beforescalafixCli
is no longer needed sincescalafix
accepts cli flags
- New
scalafixDependencies
setting key to install custom rules from Maven Central. - Common build mis-configuration such as missing compiler options are reported by Scalafix before compilation starts helping users detect problems as soon as possible.
- Syntactic rules no longer trigger compilation significantly speeding up usage if you only use syntactic rules.
Check out the installation instructions to learn more how to use the sbt plugin.
Performance 🚀
This release improves the performance of the Scalafix command-line interface and the sbt plugin. A user reported speedups from 65 minutes down to to 2 minutes when running rewrites on a large codebase after upgrading from the previous release.
New build tools API 🔧
There is now an official public API to programmatically invoke Scalafix from build tools or IDEs. The API is available in the module scalafix-interfaces
and it's written in Java with zero dependencies weighing a total of 12kb. The API is designed to have a stable binary interface across future releases of Scalafix. This API is used by the new sbt plugin, and is available to users who would like to integrate Scalafix with other build tools like Maven, Gradle.
To learn more about the build tools API, consult the scalafix-interfaces Javadocs.
Breaking changes ⚠️
For end users
- The v0.5.x API for rules has moved from the
scalafix
package intoscalafix.v0
. Thescalafix.v0
package will be removed when Scalafix v1.0 is released in the future. - The rules
Disable
andMissingFinal
have moved to a separate project https://github.com/vovapolu/scaluzzi - The rule
ExplicitResultTypes
has been removed since it produced incorrect code. - The rules
DottyKeywords
,DottyVarArgPattern
andDottyVolatileLazyVal
have been removed. Scala 3 migration rewrites will be published as a separate project so that they can evolve at a different pace than the Scalafix core APIs. - The
sbtfix
task in the sbt plugin has been removed, usescalafix --files build.sbt --files project
instead.
For tooling integrations
- The command-line interface requires the --classpath argument to include a full classpath, including dependencies. Dependencies do not have to be compiled with the SemanticDB compiler plugin but sources that Scalafix should analyze must be compiled with SemanticDB.
- The command-line interface has a new --scalac-options flag to document what compiler options were used to compile the sources. This is required by rules like
RemoveUnused
to validate the-Ywarn-unused-import
is enabled and in the future also to ensure that Scalafix respects SemanticDB options like-P:semanticdb:targetroot
and-P:semanticdb:exclude
.
For rule authors
- The scalafix.g8 template has changed, it is recommended to regenerate a project using the instruction in https://scalacenter.github.io/scalafix/docs/developers/setup.html
- Some APIs have moved
Before | Now |
---|---|
import scalafix._ |
import scalafix.v0._ |
import org.langmeta._ |
import scala.meta._ |
import scala.meta.Database |
import scalafix.v0.Database |
import scala.meta.Document |
import scalafix.v0.Document |
import scala.meta.Symbol |
import scalafix.v0.Symbol |
import scala.meta.Denotation |
import scalafix.v0.Denotation |
import scala.meta.ResolvedName |
import scalafix.v0.ResolvedName |
import scala.meta.ResolvedSymbol |
import scalafix.v0.ResolvedSymbol |
import scala.meta.Synthetic |
import scalafix.v0.Synthetic |
It is recommended to migrate rules to use the new scalafix.v1
API, which imposes further changes from scalafix.v0
:
v0 | v1 |
---|---|
object MyRule extends v0.Rule("MyRule") |
class MyRule extends v1.SyntacticRule("MyRule") |
case class MyRule(index: SemanticdbIndex) extends v0.SemanticRule(index, "MyRule") |
class MyRule extends v1.SemanticRule("MyRule") |
override def init(conf: metaconfig.Conf): Configured[v0.Rule] |
override def withConfiguration(conf: scalafix.v1.Configuration): Configured[v1.Rule] |
override def fix(ctx: v0.RuleCtx): Patch |
// for syntactic rules
override def fix(implicit doc: v1.SyntacticDoc): Patch
// for semantic rules
override def fix(implicit doc: v1.SemanticDoc): Patch |
// Patch operations where `ctx: v0.RuleCtx`
ctx.addRight()
ctx.replaceTree()
ctx.removeImportee() |
Patch.addRight()
Patch.replaceTree()
Patch.removeImportee() |
Additionally, v1
rules are now loaded using JDK ServiceLoader. To make a custom rule discoverable to Scalafix, create a resource file META-INF/services/scalafix.v1.Rule
with the fully qualified name of your rule
// resource file META-INF/services/scalafix.v1.Rule
fully.qualified.MyRule
Contributors ❤️
Big thanks to all 19 contributors who made this release possible
$ git shortlog -sn --no-merges v0.5.10..HEAD
Ólafur Páll Geirsson
vovapolu
Marcelo Cenerino
Guillaume Massé
tanishiking24
Sam Halliday
Eugene Burmako
Shane Delmore
Sean Sullivan
Piotr Galar
Sergii Kyryliuk
Øyvind Raddum Berg
Jimin Hsieh
Per Øyvind Kanestrøm
nicodelpiano
Joan Goyeau
Gabriele Petronella
Eugene Yokota
Andrew Valencik
Scalafix v0.9.0-RC1
It's barely been 24 hours since Scalafix https://github.com/scalacenter/scalafix/releases/tag/v0.8.0-RC1 release but a lot has happened since then :)
Feature improvements
- #877 Add
Disable.noUniversalEquality
to report errors for usage of==
https://scalacenter.github.io/scalafix/docs/rules/DisableSyntax.html - #885 Respect
-P:semanticdb:exclude
compiler option and update docs on excluding files https://scalacenter.github.io/scalafix/docs/users/installation.html - #882 Respect
-P:semanticdb:targetroot
- scalacenter/sbt-scalafix#29 Fix false validation error message for empty root projects
Rule authors
- #878 Add "Cookbook" for how to use the new
SemanticTree
https://scalacenter.github.io/scalafix/docs/developers/semantic-tree.html#cookbook
scalafix-noinfer
wrote 'stricter Scala with -Xlint, -Xfatal-warnings, and Scalafix'. I am so excited about the Scalafix 0.8.0-RC1 that came out today that I wrote a custom Scalafix rule scalafix-noinfer. #scala http://eed3si9n.com/stricter-scala-with-xlint-xfatal-warnings-and-scalafix
- Eugene Yakota (@eed3si9n) September 20, 2018
Breaking changes
This release bumps the minor version since the signature of scalafix.v1.IdTree
has changed
// before
case class IdTree(symbol: Symbol)
// now
case class IdTree(info: SymbolInfo) { def symbol = info.symbol }
Big thanks to everybody who reported issues and contributed to this release!
Scalafix v0.8.0-RC1
We are excited to announce the release of Scalafix v0.8.0. Scalafix is a refactoring and linting tool for Scala.
This release includes improvements to documentation, the sbt plugin, better semantic APIs, improved support for custom rules and more.
This release has been under development since January 2018 and includes contributions from 19 contributors. Big thanks to everybody who made it possible!
Documentation 📖
Scalafix has a new website https://scalacenter.github.io/scalafix/
- Rule author tutorial
- API reference overview in addition to dedicated pages for key components:
- Patch: to rewrite sources
- SymbolMatcher: to match interesting tree nodes
- SymbolInformation: to query metadata about symbols
- SemanticType: to inspect types of variables
- SemanticTree: to query inferred type parameters and implicits
- Improved sbt installation instructions
Scalameta v4.0 🔥
The Scalameta dependency has been upgraded to the newly released v4.0.0
- Release notes: https://github.com/scalameta/scalameta/releases/tag/v4.0.0
- New Scalameta docs: https://scalameta.org/
New Semantic API 🧙
Semantic rules can now perform more advanced code analysis thanks to improvements in the semantic API:
- Rules can look up symbol information for any symbol on the classpath, including dependencies. Previously, Scalafix only supported looking up information about symbols that were defined in the project.
- The SymbolInformation data structure (previously named
Denotation
) now includes richer information about the symbol's signature, annotations and visibility access. - Rules can inspect the SemanticType, which is a sealed data structure describing the type of variables and parameters. Previously, value signatures were represented as strings making them difficult to analyze.
- Rules can inspect SemanticTree, which is a sealed data structure describing synthetic code that is generated by the compiler from inferred type parameters, implicit arguments, implicit conversions and for comprehensions. Previously, synthetics were encoded as strings making them difficult to analyze.
The new Scalafix semantic API was made possible thanks to recent improvements in SemanticDB.
Improved sbt plugin 🛠
The sbt plugin has been overhauled to address issues with the previous plugin that were reported by our users. The new sbt plugin integrates directly with Scalafix library APIs resulting in an overall more polished user experience.
- The old
scalafix
,scalafixTest
andscalafixCli
tasks have been merged into a single task:scalafix
.scalafixTest
is nowscalafix --check
scalafix
continues to work as beforescalafixCli
is no longer needed sincescalafix
accepts cli flags
- New
scalafixDependencies
setting key to install custom rules from Maven Central. - Common build mis-configuration such as missing compiler options are reported by Scalafix before compilation starts helping users detect problems as soon as possible.
- Syntactic rules no longer trigger compilation significantly speeding up usage if you only use syntactic rules.
Check out the installation instructions to learn more how to use the sbt plugin.
Performance 🚀
This release improves the performance of the Scalafix command-line interface and the sbt plugin. A user reported speedups from 65 minutes down to to 2 minutes when running rewrites on a large codebase after upgrading from the previous release.
New build tools API 🔧
There is now an official public API to programmatically invoke Scalafix from build tools or IDEs. The API is available in the module scalafix-interfaces
and it's written in Java with zero dependencies weighing a total of 12kb. The API is designed to have a stable binary interface across future releases of Scalafix. This API is used by the new sbt plugin, and is available to users who would like to integrate Scalafix with other build tools like Maven, Gradle.
To learn more about the build tools API, consult the scalafix-interfaces Javadocs.
Breaking changes ⚠️
For end users
- The v0.5.x API for rules has moved from the
scalafix
package intoscalafix.v0
. Thescalafix.v0
package will be removed when Scalafix v1.0 is released in the future. - The rules
Disable
andMissingFinal
have moved to a separate project https://github.com/vovapolu/scaluzzi - The rule
ExplicitResultTypes
has been removed since it produced incorrect code. - The rules
DottyKeywords
,DottyVarArgPattern
andDottyVolatileLazyVal
have been removed. Scala 3 migration rewrites will be published as a separate project so that they can evolve at a different pace than the Scalafix core APIs. - The
sbtfix
task in the sbt plugin has been removed, usescalafix --files build.sbt --files project
instead.
For tooling integrations
- The command-line interface requires the --classpath argument to include a full classpath, including dependencies. Dependencies do not have to be compiled with the SemanticDB compiler plugin but sources that Scalafix should analyze must be compiled with SemanticDB.
- The command-line interface has a new --scalac-options flag to document what compiler options were used to compile the sources. This is required by rules like
RemoveUnused
to validate the-Ywarn-unused-import
is enabled and in the future also to ensure that Scalafix respects SemanticDB options like-P:semanticdb:targetroot
and-P:semanticdb:exclude
.
For rule authors
- The scalafix.g8 template has changed, it is recommended to regenerate a project using the instruction in https://scalacenter.github.io/scalafix/docs/developers/setup.html
- Some APIs have moved
Before | Now |
---|---|
import scalafix._ |
import scalafix.v0._ |
import org.langmeta._ |
import scala.meta._ |
import scala.meta.Database |
import scalafix.v0.Database |
import scala.meta.Document |
import scalafix.v0.Document |
import scala.meta.Symbol |
import scalafix.v0.Symbol |
import scala.meta.Denotation |
import scalafix.v0.Denotation |
import scala.meta.ResolvedName |
import scalafix.v0.ResolvedName |
import scala.meta.ResolvedSymbol |
import scalafix.v0.ResolvedSymbol |
import scala.meta.Synthetic |
import scalafix.v0.Synthetic |
It is recommended to migrate rules to use the new scalafix.v1
API, which imposes further changes from scalafix.v0
:
v0 | v1 |
---|---|
object MyRule extends v0.Rule("MyRule") |
class MyRule extends v1.SyntacticRule("MyRule") |
case class MyRule(index: SemanticdbIndex) extends v0.SemanticRule(index, "MyRule") |
class MyRule extends v1.SemanticRule("MyRule") |
override def init(conf: metaconfig.Conf): Configured[v0.Rule] |
override def withConfiguration(conf: scalafix.v1.Configuration): Configured[v1.Rule] |
override def fix(ctx: v0.RuleCtx): Patch |
// for syntactic rules
override def fix(implicit doc: v1.SyntacticDoc): Patch
// for semantic rules
override def fix(implicit doc: v1.SemanticDoc): Patch |
// Patch operations where `ctx: v0.RuleCtx`
ctx.addRight()
ctx.replaceTree()
ctx.removeImportee() |
Patch.addRight()
Patch.replaceTree()
Patch.removeImportee() |
Additionally, v1
rules are now loaded using JDK ServiceLoader. To make a custom rule discoverable to Scalafix, create a resource file META-INF/services/scalafix.v1.Rule
with the fully qualified name of your rule
// resource file META-INF/services/scalafix.v1.Rule
fully.qualified.MyRule
Contributors ❤️
Big thanks to all 19 contributors who made this release possible
$ git shortlog -sn --no-merges v0.5.10..HEAD
Ólafur Páll Geirsson
vovapolu
Marcelo Cenerino
Guillaume Massé
tanishiking24
Sam Halliday
Eugene Burmako
Shane Delmore
Sean Sullivan
Piotr Galar
Sergii Kyryliuk
Øyvind Raddum Berg
Jimin Hsieh
Per Øyvind Kanestrøm
nicodelpiano
Joan Goyeau
Gabriele Petronella
Eugene Yokota
Andrew Valencik
Scalafix v0.6.0-M16
- #814 add
Tree.inspect
andTree.inspectLabeled
helper method for a way to explore tree structures. Thank you @MasseGuillaume for implementing this in https://github.com/masseguillaume/scalameta-structure ! - #808 migrate the website to docusaurus, this is the first step towards improving documentation for users and rule authors.
- #809 make further progress with the scalafix.v1 API. All builtin rules except
Disable
are now using the v1 API. Documentation using the new website will come soon!
Scalafix v4.0.0-M15
- #802 by @MasseGuillaume Fix legacy synthetics
- #801 by @MasseGuillaume Add names to
v0.Denotation
Scalafix v0.6.0-M14
IMPORTANT. If you are on sbt 1.1 and can't upgrade to sbt v1.2.1 then the recommended version is 0.6.0-M14-3
to work around sbt/sbt#4299 ClassCastException: sbt.internal.util.Init$SettingList
.
- #786 Upgrade to Scalameta v4.0.0-M8. This is likely one of the last milestone releases before Scalameta v4. At this time there are 5 remaining open tickets in the milestone for v4.0 https://github.com/scalameta/scalameta/milestone/26
- #781 Support loading custom rules by their name instead of FQN. This allows custom rules to include a text file
META-INF/services/scalafix.v1.Rule
in resources with the FQN of the rule so that users can reference external rules by their name (for exampleNoVars
) instead of the fully qualified class name (for exampleclass:com.bar.NoVars
). - #783 Add scalafix-interfaces with Java APIs for reflective invocation. This PR adds a Java module
scalafix-interfaces
that can be used by build tools and IDEs to invoke Scalafix using JVM reflection. The module is 8kb with no external dependencies, the documentation is available here: https://www.javadoc.io/doc/ch.epfl.scala/scalafix-interfaces/0.6.0-M14 - scalacenter/sbt-scalafix#9 support
scalafixDependencies: List[ModuleID]
setting in sbt-scalafix to run external custom rewrites that are published to Maven. This feature is required for the upcoming Scala collection migration rewrites. - scalacenter/sbt-scalafix#8 add back sbt 0.13 support to sbt-scalafix. The last M12 release only supported sbt 0.13.
Scalafix v0.6.0-M12
NOTE. This milestone release is unstable, it is recommended to stay on v0.5.10 until all of the tickets in scalameta/scalameta/milestone/26 have been fixed.
Rule authors
The Scalameta dependency has been updated to v4.0.0-M6, see release notes.
There is a best-effort automatic rewrite to upgrade scalafix.g8 generated builds from v0.5. Full instructions are available here.
If you use SymbolMatcher.exact
, make sure to update hardcoded symbols to use the new format
- package symbols now use slash
/
instead of dot.
- Before:
scala.collection.immutable.List#
- Now:
scala/collection/immutable/List#
- Before:
- val symbols now use dot
.
without()
- Before:
scala.package.Either().
- Now:
scala/package.Either.
- Before:
Users
Please wait until v0.6 stable is out and the website has been updated to document the latest improvements.
Scalafix v0.6.0-M11
NOTE. This milestone release is unstable, it is recommended to stay on v0.5.10 until all of the tickets in https://github.com/scalameta/scalameta/milestone/26 have been fixed.
- upgrade to Scalameta v4.0.0-M4, #756
- the sbt plugin has been moved to a separate repository https://github.com/scalacenter/sbt-scalafix.
- the sbt plugin will temporarily only work for sbt 1.0. Support for 0.13 will be re-instated before v0.6 final.
- the sbt plugin no longer dynamically resolves and classloads scalafix artifacts, it's a "normal plugin" now.