Refactoring and linting tool for Scala
BSD-3-CLAUSE License
Bot releases are hidden (Show)
Published by mlachkar almost 4 years ago
Published by olafurpg over 4 years ago
None
and Nil
instead or Option.empty[T]
and List.empty[T]
when inserting explicit result types for Option[T]
and List[T]
Published by olafurpg about 5 years ago
Published by olafurpg about 5 years ago
Published by olafurpg over 5 years ago
Upgrade to Scalameta v4.1.9.
Published by olafurpg over 5 years ago
Published by olafurpg over 5 years ago
Published by olafurpg over 5 years ago
Published by olafurpg almost 6 years ago
We are happy to announce the release of Scalafix v0.9.1. Scalafix is a refactoring and linting tool for Scala.
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 https://github.com/scalacenter/scalafix/pull/898. Big thanks to @marcelocenerine for this contribution!
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!
Scalafix now runs on Java 11. Our CI additionally runs the full build on Java 11 for every PR to prevent regressions.
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
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
The new option DisableSyntax.noWhileLoops=true
will trigger Scalafix to error on the usage of while loops.
PR https://github.com/scalacenter/scalafix/pull/910 improved the reported messages for unexpected errors. Thanks to @raboof for reporting!
$ git shortlog -sn --no-merges v0.9.0..v0.9.1
Jacob Barber
Ólafur Páll Geirsson
Kamil Kloch
Marcelo Cenerino
Published by olafurpg about 6 years ago
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!
Scalafix has a new website https://scalacenter.github.io/scalafix/
The Scalameta dependency has been upgraded to the newly released v4.0.0
Semantic rules can now perform more advanced code analysis thanks to improvements in the semantic API:
Denotation
) now includes richer information about the symbol's signature, annotations and visibility access.The new Scalafix semantic API was made possible thanks to recent improvements in SemanticDB.
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.
scalafix
, scalafixTest
and scalafixCli
tasks have been merged into a single task: scalafix
.
scalafixTest
is now scalafix --check
scalafix
continues to work as beforescalafixCli
is no longer needed since scalafix
accepts cli flagsscalafixDependencies
setting key to install custom rules from Maven Central.Check out the installation instructions to learn more how to use the sbt plugin.
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.
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.
scalafix
package into scalafix.v0
. The scalafix.v0
package will be removed when Scalafix v1.0 is released in the future.Disable
and MissingFinal
have moved to a separate project https://github.com/vovapolu/scaluzzi
ExplicitResultTypes
has been removed since it produced incorrect code.DottyKeywords
, DottyVarArgPattern
and DottyVolatileLazyVal
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.sbtfix
task in the sbt plugin has been removed, use scalafix --files build.sbt --files project
instead.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
.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
:
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
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
Published by olafurpg about 6 years ago
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 :)
Disable.noUniversalEquality
to report errors for usage of ==
https://scalacenter.github.io/scalafix/docs/rules/DisableSyntax.html
-P:semanticdb:exclude
compiler option and update docs on excluding files https://scalacenter.github.io/scalafix/docs/users/installation.html
-P:semanticdb:targetroot
SemanticTree
https://scalacenter.github.io/scalafix/docs/developers/semantic-tree.html#cookbook
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
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!
Published by olafurpg about 6 years ago
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!
Scalafix has a new website https://scalacenter.github.io/scalafix/
The Scalameta dependency has been upgraded to the newly released v4.0.0
Semantic rules can now perform more advanced code analysis thanks to improvements in the semantic API:
Denotation
) now includes richer information about the symbol's signature, annotations and visibility access.The new Scalafix semantic API was made possible thanks to recent improvements in SemanticDB.
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.
scalafix
, scalafixTest
and scalafixCli
tasks have been merged into a single task: scalafix
.
scalafixTest
is now scalafix --check
scalafix
continues to work as beforescalafixCli
is no longer needed since scalafix
accepts cli flagsscalafixDependencies
setting key to install custom rules from Maven Central.Check out the installation instructions to learn more how to use the sbt plugin.
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.
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.
scalafix
package into scalafix.v0
. The scalafix.v0
package will be removed when Scalafix v1.0 is released in the future.Disable
and MissingFinal
have moved to a separate project https://github.com/vovapolu/scaluzzi
ExplicitResultTypes
has been removed since it produced incorrect code.DottyKeywords
, DottyVarArgPattern
and DottyVolatileLazyVal
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.sbtfix
task in the sbt plugin has been removed, use scalafix --files build.sbt --files project
instead.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
.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
:
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
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
Published by olafurpg about 6 years ago
⚠️ This is an unstable and undocumented milestone release intended only for early adopters. It's recommended to stay on v0.5.10 until v0.6.0 stable is out.
Tree.inspect
and Tree.inspectLabeled
helper method for a way to explore tree structures. Thank you @MasseGuillaume for implementing this in https://github.com/masseguillaume/scalameta-structure !Disable
are now using the v1 API. Documentation using the new website will come soon!Published by olafurpg about 6 years ago
⚠️ This is an unstable and undocumented milestone release intended only for early adopters. It's recommended to stay on v0.5.10 until v0.6.0 stable is out.
v0.Denotation
Published by olafurpg about 6 years ago
⚠️ This is an unstable and undocumented milestone release intended only for early adopters. It's recommended to stay on v0.5.10 until v0.6.0 stable is out.
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 https://github.com/sbt/sbt/issues/4299 ClassCastException: sbt.internal.util.Init$SettingList
.
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 example NoVars
) instead of the fully qualified class name (for example class:com.bar.NoVars
).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
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.Published by olafurpg about 6 years ago
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.
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
/
instead of dot .
scala.collection.immutable.List#
scala/collection/immutable/List#
.
without ()
scala.package.Either().
scala/package.Either.
Please wait until v0.6 stable is out and the website has been updated to document the latest improvements.
Published by olafurpg over 6 years ago
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.
Published by olafurpg over 6 years ago
scalafix.cli.Cli
backPublished by olafurpg over 6 years ago
NOTE. v0.6.0-M3 has been released with minor fixes.
This is the second milestone release for v0.6 that includes more architectural change in how semantic rewrites work.
⚠️ This release is still not intended for public usage yet, there are several known regressions that need to be addressed before releasing v0.6.0 stable. ⚠️
scalafixAutoSuppressLinterErrors
Contributed by @vovapolu, funded by Scalafix Bountysource. It is difficult to introduce new linter rules into existing large codebases. Scalafix already supports the --diff
and --diff-base=master
options to run linters on a subset of the codebase. This feature enables users to automatically insert /* scalafix:ok */
comments next to linter violations.
// before
var x = null // ERROR, null is disallowed!
// after running scalafixAutoSuppressLinterErrors
var x = null/* scalafix:ok */ // OK, error suppressed by comment
By inserting the comment in the codebase, your team may be extra motivated to fix suppressed errors.
Contributed by @vovapolu, funded by Scalafix Bountysource. Previously, it was only possible to disable individual symbols with the Disable
rule. Now it is possible to disable a group of symbols matching a given regex. In .scalafix.conf
, configure
Disable.symbols = [
{
regex = {
includes = "scala.collection.mutable.*"
excludes = "scala.collection.mutable.ArrayBuffer"
}
message = "Use immutable data structures"
}
]
This configuration will report errors on all usages of symbols from the scala.collection.mutable
package excluding ArrayBuffer
.
Contributed by @marcelocenerine. In addition to /* scalafix:off */
comments, it's now possible to suppress linter errors with @SuppressWarnings("scalafix:NoNulls")
annotations. Annotations are enabled across the range of the definition they annotate.
@SuppressWarnings("scalafix:NoNulls")
def dirtyBusiness(): Unit = {
var x = null // OK, because NoNulls rule is disabled
...
}
// NoNulls rule is re-enabled after dirtyBusiness() definition
var x = null // error, nulls are disabled
When mixed with /* scalafix:off */
comments, annotations take precedence.
Contributed by @tanishiking. Now it's possible to read brief descriptions for rules when using tab completion in both sbt and zsh.
Contributed by @olafurpg and @xeno-by, relevant for rule authors. This is the first step towards making it possible for rules to lookup full type signatures of Java and Scala signatures from the classpath of a program. This functionality is enabled thanks to
Type
metacp
library and command-line tool to extract SemanticDB type signatures from a classpathsemanticdb-scalac
compiler plugin to emit new type signaturesThis is the result of a multiple month effort and will open many exciting use-cases for rule authors in the future, including
semanticdb-scalac
compiler plugin. This means you need to manually add the following snippet of code in your build.sbt for all projects.addCompilerPlugin(semanticdbScalac)
scalacOptions += "-Yrangepos"
sbtfix
and sbtfixTest
no longer support running semantic rules. It's now only possible to run syntactic rules on *.sbt
files.The following list is a summary of the activity since the last milestone release.
--auto-suppress-linter-errors
in cli and scalafixAutoSuppressLinterErrors
task in sbt-scalafix to automatically insert /* scalafix:ok */
to suppress linter violationsBig thanks to 11 contributors for making this release happen!
$ git shortlog -sn --no-merges v0.6.0-M1..v0.6.0-M2
37 vovapolu
22 Ólafur Páll Geirsson
18 Marcelo Cenerino
6 tanishiking24
3 Sean Sullivan
2 Jimin Hsieh
2 Eugene Burmako
1 Sam Halliday
1 Eugene Yokota
1 Andrew Valencik
1 Shane Delmore
Published by olafurpg over 6 years ago
NOTE. We recommend to stay on 0.5.10 for at least a couple more milestone releases. This milestone release is primarily intended for downstream tooling to catch up to latest changes in Scalameta v3.
This release includes the following breaking changes
clean;compile
to rebuild old SemanticDB payloads.
scalafixCli
task only runs in main configuration, not test. To get the old behavior, compile:scalafixCli ; test:scalafixCli
.scalafixConfigure(Compile, Test, IntegrationTest)
has been replaced with inConfig(IntegrationTest)(scalafixConfigSettings)
We plan to release at least one more milestone release that will do more breaking changes in sbt-scalafix related to installation. We are aiming for 0 breaking changes in the rewrite/lint API.