Skip to content

Releases: scalacenter/scalafix

Scalafix 0.4.2

11 Sep 17:12
Compare
Choose a tag to compare

v0.4.1

11 Sep 17:13
Compare
Choose a tag to compare

First of all, I'd like to welcome Gabriele Petronella, @gabro, to the scalafix team! See #184.

Big thanks you everybody who contributed this release via issues, pull requests, online discussions on Gitter.

Scalafix 0.4.0

11 Sep 17:15
Compare
Choose a tag to compare

This release represents a significant milestone for Scalafix. Scalafix no longer runs as a compiler plugin as it did in previous releases. Instead, Scalafix runs now independently from the compiler, and uses the Scalameta Semantic API to query information from the compiler.

New features

Breaking changes

  • The scalafix-nsc compiler plugin has been removed in favor of the Scalameta Semantic DB, that is emitted by the Scalameta semanticdb-scalac compiler plugin. This change enables Scalafix rules to run separately from compilation. This means that running scalafix will be much faster, since it no longer requires creating a custom instance of the Scala compiler and re-typechecking an entire project. Scalafix reads all of its inputs from .semanticdb files that are created by the semanticdb-scalac compiler plugin during regular compilation.

  • The signature of Rule.rule has been simplified

    // before
    def rule[T](ctx: RuleCtx[T]): Seq[Patch]
    // after
    def rule(ctx: RuleCtx): Patch
    
    // a Seq[Patch] can be converted into Patch with .asPatch
    Seq[Patch]().asPatch: Patch
    
  • RuleCtx.mirror has been removed. To write semantic rules, accept SemanticCtx as a constructor parameter instead

    // before
    case object MySemanticRule extends Rule {
      def rule[T](ctx: RuleCtx[T]): Seq[Patch]
    }
    // after
    case class MySemanticRule(index: SemanticdbIndex) extends SemanticRule(index) {
      def rule(ctx: RuleCtx): Patch
    }
    
  • scalafix.patch.TreePatch.{AddGlobalImport, RemoveGlobalImport, Replace, ...} have been made private[scalafix]. Instead, use the provided operations on ctx: RuleCtx.

    // before
    TokenPatch.AddGlobalImport(importer"scala.meta._")
    
    // after
    ctx.addGlobalImport(importer"scala.meta._")
    

    The motivation for this change was to statically enforce that a SemanticCtx is in scope during Patch creation. For the full available API of patch operations, see SemanticPatchOps

  • The following configuration options have been removed

    imports.removeUnusedImports // replaced by RemoveUnusedImports rule.
    
    // These were wishful thinking, too eagerly merged.
    imports.organizeImports
    imports.expandRelative
    imports.groupByPrefix
    
  • scalafix-cli now enabled the --in-place (-i) flag by default. Use --stdout to print to standard output.

  • scalafix-testkit no longer reads tests from .source files. Instead, tests are written in regular .scala files that are compiled through sbt or another build tool. See scalafix-testkit for how to use it.

git shortlog -sn --no-merges v0.3.0..v0.4.0 tells us that 4 people contributed to this release:

  • Ólafur Páll Geirsson
  • Gabriele Petronella
  • Allan Renucci
  • Matthias Langer

v0.3.4

11 Sep 17:16
Compare
Choose a tag to compare
  • New RenameSymbol tree patch, which behaves similar to "Rename method/variable" refactorings in IDEs.
  • New module: scalafix-testkit.
  • Rules can now report info/warn/error messages via ctx.reporter.info/warn/error, see #118.
  • 2.11 support is now only for 2.11.10.

Scalafix 0.3.3

11 Sep 17:16
Compare
Choose a tag to compare
  • NOTE. scalafix-core and scalafix-cli are now published as CrossVersion.full, meaning the artifact IDs now have a _2.11.11 suffix. To depend on them,

    // OK
    libraryDependencies +=
      "ch.epfl.scala" % "scalafix-core" % "0.5.0-RC3" cross CrossVersion.full
    // Error
    libraryDependencies +=
      "ch.epfl.scala" %% "scalafix-core" % "0.5.0-RC3"
    
  • NOTE. This version depends on a pre-release of scala.meta, which is publised to the scalameta bintray repository and requires

    resolvers += Resolver.bintrayRepo("scalameta", "maven")
    
  • scalafix-cli new supports running semantic rules with the --classpath/--sourcepath options.

  • scalafix-cli now supports .sbt files.

  • New documentation for scalafix-cli.

Scalafix 0.3.2

11 Sep 17:17
Compare
Choose a tag to compare

See merged PRs.

  • It is possible to load custom rules from source with rules = ["file:MyRule.scala"] or urls rules = ["https://gist./../.Rule.scala"].
  • imports.groups = [] can now be empty, thank you @mlangc for contributing this fix!
  • Named imports are no longer subsumed by wildcard imports, which could previously introduce ambiguous imports.
  • imports.expandRelative = false by default. Expanded relative imports can create unused imports. If you want to expand relative imports, you may need to run scalafix twice to remove unused imports created by scalafix.
  • Fixed minor ordering bugs in organize imports.

Scalafix 0.3.1

11 Sep 17:17
Compare
Choose a tag to compare
  • Fixed a bug in organize imports when there was no import in the original source file.
  • Patch.apply and OrganizeImports no longer accept a redundant tree: Tree argument, the ctx already contains the tree.
  • Xor2Either is disabled by default now, it was enabled by default causing the scalafix command to slow down significantly. Rules using scala.meta.Mirror should not experience a slowdown.
  • Added new Rename(from: Name, to: Name) tree patch that's accesible via the scalafix-library.

Scalafix 0.3.0

11 Sep 17:17
Compare
Choose a tag to compare
  • Scalafix now uses the scala.meta semantic API! See scala.meta 1.6 release notes for more details about the semantic api. This first release of the scala.meta semantic API enables rules to query for the "symbol" of a name that appears in a Scala source file. A symbol is a unique identifier of a definition such as a class, val, def or trait.

  • To demonstrate the capabilities of rules using the scala.meta semantic API, we have included an example rule called Xor2Either. The rule migrates usage of cats.data.Xor to scala.util.Either.

  • Rules can now be implemented in terms of "tree patches", which are high level descriptions of common refactoring operations. Tree patches can be composed to build more advanced refactorings such as Xor2Either. The current available tree patches are

    • Replace: Replaces usage of a symbol with another name.
    • AddGlobalImport: Adds a top-level import to source file.
    • RemoveGlobalImport: Removes a top-level import from source file.

    Special thanks go to @ShaneDelmore for helping out try the scalafix patch API at every step of its development. His feedback has been invaluable in improving the design of the API.

  • Configuration in .scalafix.conf has been greatly improved to support a wide range of options. Examples, see patches, imports (now removed) and All options (removed).

Scalafix 0.2.1

11 Sep 17:18
Compare
Choose a tag to compare
  • sbt scalafix runs ExplicitImplicit and ProcedureSyntax by default when there is no .scalafix.conf.
  • Upgraded scala.meta dependency to fix parsing + pretty-printer bugs.

Scalafix 0.2.0

11 Sep 17:18
Compare
Choose a tag to compare
  • First semantic rule! See ExplicitReturnTypes.
  • Removed command line interface in favor of compiler plugin. Why? To run semantic rules, scalafix needs to compile source files. The scalafix command line tool has no aspiration to become a build tool.