Scalafix v0.6.0-M2
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.
Highlights
Automatically suppress linter errors with 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.
Disable symbol by regex
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
.
Respect @SuppressWarnings to disable rules
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.
Tab completions show rule descriptions
Contributed by @tanishiking. Now it's possible to read brief descriptions for rules when using tab completion in both sbt and zsh.
Upgrade to SemanticDB v3.7
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
- a comprehensive spec covering details of how Scala and Java signatures map to SemanticDB
Type
- new
metacp
library and command-line tool to extract SemanticDB type signatures from a classpath - updates to
semanticdb-scalac
compiler plugin to emit new type signatures
This is the result of a multiple month effort and will open many exciting use-cases for rule authors in the future, including
- robust organize imports refactoring
- scope-aware pretty printing
- class hierarchy aware linting
Breaking changes
- sbt-scalafix no longer automatically installs the
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"
- Code that was deprecated in v0.5.x has been removed
sbtfix
andsbtfixTest
no longer support running semantic rules. It's now only possible to run syntactic rules on*.sbt
files.
Summary of pull requests
The following list is a summary of the activity since the last milestone release.
End user facing
- #496 by olafurpg, sbt-scalafix now respects unmangedSources.in(scalafix)
- #587 by vovapolu, make sbt-scalafix follow conventions around sbt configurations
- #589 by olafurpg, sbt-scalafix no longer automatically instals semanticdb-scalac compiler plugin
- #601 #669 by vovapolu, new configuration options for Disable rule
- #611 by tanishiking, fix invalid rewrite for ProcedureSyntax
- #616 by eed3si9n, fix bug in ProcedureSyntax rule for type params
- #620 by marcelocenerine, Respect @SuppressWarnings to disable rules
- #639 by tanishiking, add completion for rules description in zsh.
- #642 by tanishiking, add completion for rules description in sbt.
- #645 by olafurpg, sbtfix task no longer supports semantic rewriting, only syntactic
- #646 by vovapolu, add
--auto-suppress-linter-errors
in cli andscalafixAutoSuppressLinterErrors
task in sbt-scalafix to automatically insert/* scalafix:ok */
to suppress linter violations - #669 by vovapolu, add support to disable symbol via regex
Docs
- #637 by ShaneDelmore, add link to pants scalafix usage instructions in docs
- #667 by jiminhsieh, fix invalid scalacOption in docs.
- #671 by jiminhsieh, fix typo in docs
- #644 by olafurpg, remove sbtfix and semanticdb-sbt from the installation docs.
- #654 by valencik, fix vertical alignment of comments in docs
- #657 by tanishiking, fix typo in README
Rule author facing
- #474 by marcelocenerine, add methods for dealing with whitespaces in patch API
- #534 by marcelocenerine, make 'from' parameter in TokenList.slice/find inclusive
Internal
- #509 by olafurpg, bootstrap: use scalafix in scalafix build
- #585 by MasseGuillaume, add AppVeyor as a CI on Windows
- #590 by olafurpg, remove deprecated APIs from v0.5.0 release
- #595 by xeno-by, upgrade to Scalameta 3.0.0
- #602 by xeno-by, upgrade to Scalameta 3.2.0
- #615 by xeno-by, upgrade to Scalameta 3.3.1
- #615 by xeno-by, upgrade to Scalameta 3.3.1
- #618 by olafurpg, simplify ProcedureSyntax implementation
- #633 #631 #630 by sullis, upgrade build dependencies
- #675 by olafurpg, upgrade to scalameta 3.7.0 with default settings.
- #677 by olafurpg, Upgrade to Scalameta v3.7.3
Thank you!
Big 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