Skip to content

Releases: scalacenter/scalafix

Scalafix v0.5.0-RC3

11 Sep 15:23
Compare
Choose a tag to compare

New features for end-users

This release introduces major improvements to sbt-scalafix, scalafix-cli.

New features for rule authors

  • Ability to implement rules for sources of sbt builds, including *.sbt files. The API to write sbt rules is identical to regular Scala rules.
  • Rules can now emit lint messages with ctx.lint, see LintMessage.
  • Thanks to upstream improvements in the Scalameta v2.0 Semantic API, it is now possible to
    • query symbols of implicit arguments, implicit conversions, type parameters, .apply/.unapply and symbol signatures. This represents significant portion of the work for Scalafix v0.5 and is a major milestone for the Scalameta semantic API.
    • parse symbols signatures as scala.meta.Type, including the new Type.Method which is the "type of methods" and cannot be written in source.
  • Rule.init(config): Configured[Rule] allows rules to load the user configuration during rule construction. Before, rules had to parse the configuration while fixing each individual file.
  • PatchOps.replaceSymbol/replaceTree, see Patch.
  • PatchOps now has docstrings!
  • Rules can have multiple names with optional deprecation warnings.

Bug fixes / Improvements

  • ExplicitResultTypes produces valid type signatures in a lot more cases than before. Note that it still has some known bugs, see #324.
  • More robust classloading to invoke scalafix in sbt-scalafix. Previously, sbt-scalafix used synthetic projects which cause problem in some multi-module builds. Now, sbt-scalafix uses Coursier instead.
  • Improved dynamic compilation of custom rules while running from multi-module sbt builds.
  • Extension methods now resolve to the correct symbol. For example, head in Array[Int].head previously resolved to Predef.intArrayOps and now it resolves to IndexedSeqOptimized.head.
  • scalafix-cli automatically infers whether passed --rewrites are semantic or syntactic. This means it's possible to run custom syntactic rules from scalafix-cli without passing in --classpath.

Breaking changes

From 0.5 onwards, our CI will check binary breaking changes in the public API on every pull request. Note that modules inside the package scalafix.internal don't promise binary compatibility between any releases, including PATCH upgrades.

  • github: rewrites should be inside the scalafix/rules/... directory instead of scalafix/rewrites/... directory

  • scalafix.Rewrite/SemanticRewrite is now deprecated and Mirror is now SemanticdbIndex.

    // before
    case class MyRewrite(mirror: Mirror) extends SemanticRewrite(mirror) {
      def rewrite(ctx: RewriteCtx): Patch
    }
    // before
    case class MyRule(index: SemanticdbIndex) extends SemanticRule(index) {
      def fix(ctx: RewriteCtx): Patch
    }
    
  • scalafix.testkit.SemanticRewriteSuite is now now SemanticRuleSuite.

  • scalafix.config has been moved to scalafix.internal.config. Configuration case classes break binary compatility with every new field.

  • .symbol now returns Option[Symbol] instead of Symbol. .symbolOpt has been deprecated.

  • A large number of unused methods and classes inside scalafix.internal.util.Failure, scalafix.`package` and scalafix.syntax has been removed.

  • upgraded to Scalameta 2.0, which has several breaking changes in the Tree api.

  • The VolatileLazyVal rule is now named DottyVolatileLazyVal.

Contributors

git shortlog -sn --no-merges v0.4.2..v0.5.0-RC3 shows 5 people contributed to this release.

  • Ólafur Páll Geirsson
  • Gabriele Petronella
  • Guillaume Massé
  • Taisuke Oe
  • Andy Scott

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.