Skip to content

scalafix

Scalafix lints and fixes scala files

scalafix documentation

scalafix - GitHub

Configuration in Mega-Linter

Variable Description Default value
SCALA_SCALAFIX_ARGUMENTS User custom arguments to add in linter CLI call
Ex: -s --foo "bar"
SCALA_SCALAFIX_FILTER_REGEX_INCLUDE Custom regex including filter
Ex: (src\|lib)
Include every file
SCALA_SCALAFIX_FILTER_REGEX_EXCLUDE Custom regex excluding filter
Ex: (test\|examples)
Exclude no file
SCALA_SCALAFIX_CLI_LINT_MODE Override default CLI lint mode
- file: Calls the linter for each file
- list_of_files: Call the linter with the list of files as argument
- project: Call the linter from the root of the project
{linter.cli_lint_mode}
SCALA_SCALAFIX_FILE_EXTENSIONS Allowed file extensions. "*" matches any extension, "" matches empty extension. Empty list excludes all files
Ex: [".py", ""]
[".scala"]
SCALA_SCALAFIX_FILE_NAMES_REGEX File name regex filters. Regular expression list for filtering files by their base names using regex full match. Empty list includes all files
Ex: ["Dockerfile(-.+)?", "Jenkinsfile"]
Include every file
SCALA_SCALAFIX_PRE_COMMANDS List of bash commands to run before the linter None
SCALA_SCALAFIX_POST_COMMANDS List of bash commands to run after the linter None
SCALA_SCALAFIX_CONFIG_FILE scalafix configuration file name
Use LINTER_DEFAULT to let the linter find it
.scalafix.conf
SCALA_SCALAFIX_RULES_PATH Path where to find linter configuration file Workspace folder, then Mega-Linter default rules
SCALA_SCALAFIX_DISABLE_ERRORS Run linter but consider errors as warnings false
SCALA_SCALAFIX_DISABLE_ERRORS_IF_LESS_THAN Maximum number of errors allowed 0

Mega-Linter Flavours

This linter is available in the following flavours

Flavor Description Embedded linters Info
all Default Mega-Linter Flavor 93 Docker Image Size (tag) Docker Pulls
scala Optimized for SCALA based projects 40 Docker Image Size (tag) Docker Pulls

Behind the scenes

How are identified applicable files

  • File extensions: .scala

How the linting is performed

  • scalafix is called one time by identified file

Example calls

scalafix --check myfile.scala
scalafix --check --config .scalafix.conf myfile.scala
scalafix --config .scalafix.conf myfile.scala

Help content

Scalafix 0.9.31
Usage: scalafix [options] [<path> ...]

Scalafix is a refactoring and linting tool. Scalafix supports both syntactic and
semantic linter and rewrite rules. Syntactic rules can run on source code
without compilation. Semantic rules can run on source code that has been
compiled with the SemanticDB compiler plugin.

Common options:

  --rules | -r [String ...] (default: [])
    Scalafix rules to run, for example ExplicitResultTypes. The syntax for rules is
    documented in
    https://scalacenter.github.io/scalafix/docs/users/configuration#rules

  --files | -f [<path> ...] (default: [])
    Files or directories (recursively visited) to fix.

  --config <path> (default: null)
    File path to a .scalafix.conf configuration file. Defaults to .scalafix.conf in
    the current working directory, if any.

  --check
    Check that all files have been fixed with scalafix, exiting with non-zero code
    on violations. Won't write to files.

  --stdout
    Print fixed output to stdout instead of writing in-place.

  --diff
    If set, only apply scalafix to added and edited files in git diff against the
    master branch.

  --diff-base String (default: null)
    If set, only apply scalafix to added and edited files in git diff against a
    provided branch, commit or tag.

  --syntactic
    Run only syntactic rules, ignore semantic rules even if they are explicitly
    configured in .scalafix.conf or via --rules

  --triggered
    Overlay the default rules & rule settings in .scalafix.conf with the `triggered`
    section

  --verbose
    Print out additional diagnostics while running scalafix.

  --help | -h
    Print out this help message and exit

  --version | -v
    Print out version number and exit

Semantic options:

  --classpath Classpath (default: "<classpath>")
    Full classpath of the files to fix, required for semantic rules. The source
    files that should be fixed must be compiled with semanticdb-scalac.
    Dependencies are required by rules like ExplicitResultTypes, but the
    dependencies do not need to be compiled with semanticdb-scalac.

  --sourceroot <path> (default: null)
    Absolute path passed to semanticdb with -P:semanticdb:sourceroot:<path>.
    Relative filenames persisted in the Semantic DB are absolutized by the
    sourceroot. Defaults to current working directory if not provided.

  --semanticdb-targetroots [<path> ...] (default: [])
    Absolute paths passed to semanticdb with -P:semanticdb:targetroot:<path>. Used
    to locate semanticdb files. By default, Scalafix will try to locate
    semanticdb files in the classpath

  --auto-classpath
    If set, automatically infer the --classpath flag by scanning for directories
    with META-INF/semanticdb

  --auto-classpath-roots [<path> ...] (default: [])
    Additional directories to scan for --auto-classpath

  --scalac-options [String ...] (default: [])
    The scala compiler options used to compile this --classpath, for example
    -Ywarn-unused-import

  --scala-version ScalaVersion (default: "2.13.6")
    The major or binary Scala version that the provided files are targeting, or the
    full version that was used to compile them when a classpath is provided.

Tab completions:

  --bash
    Print out bash tab completions. To install:
    ```
    # macOS, requires "brew install bash-completion"
    scalafix --bash > /usr/local/etc/bash_completion.d/scalafix
    # Linux
    scalafix --bash > /etc/bash_completion.d/scalafix
    ```

  --zsh
    Print out zsh tab completions. To install:
    ```
    scalafix --zsh > /usr/local/share/zsh/site-functions/_scalafix
    unfunction _scalafix
    autoload -U _scalafix
    ```

Less common options:

  --exclude [<glob> ...] (default: [])
    Unix-style glob for files to exclude from fixing. The glob syntax is defined by
    `nio.FileSystem.getPathMatcher`.

  --tool-classpath URLClassLoader (default: "<classloader>")
    Additional classpath for compiling and classloading custom rules, as a set of
    filesystem paths, separated by ':' on Unix or ';' on Windows.

  --charset Charset (default: "UTF-8")
    The encoding to use for reading/writing files

  --no-sys-exit
    If set, throw exception in the end instead of System.exit

  --no-stale-semanticdb
    Don't error on stale semanticdb files.

  --settings ScalafixConfig (default: {})
    Custom settings to override .scalafix.conf

  --out-from String (default: null)
    Write fixed output to custom location instead of in-place. Regex is passed as
    first argument to file.replaceAll(--out-from, --out-to), requires --out-to.

  --out-to String (default: null)
    Companion of --out-from, string that is passed as second argument to
    fileToFix.replaceAll(--out-from, --out-to)

  --auto-suppress-linter-errors
    Insert /* scalafix:ok */ suppressions instead of reporting linter errors.

  --cwd <path> (default: "/")
    The current working directory

Installation on mega-linter Docker image

  • Dockerfile commands :
# Parent descriptor install
RUN curl -fLo coursier https://git.io/coursier-cli && \
        chmod +x coursier

# Linter install
RUN ./coursier install scalafix --quiet --install-dir /usr/bin

Example success log

Results of scalafix linter (version 0.9.24)
See documentation on https://nvuillam.github.io/mega-linter/descriptors/scala_scalafix/
-----------------------------------------------

[SUCCESS] .automation/test/scala/scala_good_1.scala


Example error log

Results of scalafix linter (version 0.9.24)
See documentation on https://nvuillam.github.io/mega-linter/descriptors/scala_scalafix/
-----------------------------------------------

[ERROR] .automation/test/scala/scala_bad_1.scala
    .automation/test/scala/scala_bad_1.scala:3:34: error: [DisableSyntax.offensive] Please consider a less offensive word such as 'extension' or 'enrichment'
            println("Hello, world of pimps !")
                                     ^^^^