Skip to content

Scalafix v0.6.0-M2

Compare
Choose a tag to compare
@olafurpg olafurpg released this 11 Apr 09:22
63c8d0d

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. ⚠️

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.

scalafix-zsh-completion

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 and sbtfixTest 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 and scalafixAutoSuppressLinterErrors 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