View Source Module Directives (use, alias, ...)

Skipping Module Reordering

If you want to skip module reordering, you can add the following comment to the top of the file:

# quokka:skip-module-reordering

This will prevent Quokka from doing any of the below transformations.

Directive Expansion

This addresses:

Expands Module.{SubmoduleA, SubmoduleB} to their explicit forms for ease of searching.

# Before
import Foo.{Bar, Baz, Bop}
alias Foo.{Bar, Baz.A, Bop}

# After
import Foo.Bar
import Foo.Baz
import Foo.Bop

alias Foo.Bar
alias Foo.Baz.A
alias Foo.Bop

Directive Organization

This addresses:

Modules directives are sorted into the following order by default:

  • @shortdoc
  • @moduledoc
  • @behaviour
  • use
  • import (sorted alphabetically)
  • alias (sorted alphabetically)
  • require (sorted alphabetically)
  • everything else (order unchanged)

Before

defmodule Foo do
  @behaviour Lawful
  alias A.A
  require A

  use B

  def c(x), do: y

  import C
  @behaviour Chaotic
  @doc "d doc"
  def d do
    alias X.X
    alias H.H

    alias Z.Z
    import Ecto.Query
    X.foo()
  end
  @shortdoc "it's pretty short"
  import A
  alias C.C
  alias D.D

  require C
  require B

  use A

  alias C.C
  alias A.A

  @moduledoc "README.md"
             |> File.read!()
             |> String.split("<!-- MDOC !-->")
             |> Enum.fetch!(1)
end

After

defmodule Foo do
  @shortdoc "it's pretty short"
  @moduledoc "README.md"
             |> File.read!()
             |> String.split("<!-- MDOC !-->")
             |> Enum.fetch!(1)
  @behaviour Chaotic
  @behaviour Lawful

  use B
  use A.A

  import A.A
  import C

  alias A.A
  alias C.C
  alias D.D

  require A
  require B
  require C

  def c(x), do: y

  @doc "d doc"
  def d do
    import Ecto.Query

    alias H.H
    alias X.X
    alias Z.Z

    X.foo()
  end
end

If any line previously relied on an alias, the alias is fully expanded when it is moved above the alias:

# Given
alias Foo.Bar
import Bar
# Styled
import Foo.Bar

alias Foo.Bar

Alias Lifting

This addresses Credo.Check.Design.AliasUsage. The Credo configs supported by Quokka include:

  • :lift_alias_excluded_namespaces
  • :lift_alias_excluded_lastnames
  • :if_nested_deeper_than
  • :if_called_more_often_than

When a module with greater than :if_nested_deeper_than nested parts is referenced more than :if_called_more_often_than times, Quokka creates a new alias for that module and uses it.

# Given
require A.B.C

A.B.C.foo()
A.B.C.bar()

# Styled
alias A.B.C

require C

C.foo()
C.bar()

Collisions

Quokka won't lift aliases that will collide with existing aliases, and likewise won't lift any module whose name would collide with a standard library name.