View Source Module Directives (use, alias, ...)
Adds Moduledoc
Adds @moduledoc false to modules without a moduledoc unless the module's name ends with one of the following:
TestMixfileMixProjectControllerEndpointRepoRouterSocketViewHTMLJSON
Directive Expansion
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.BopDirective Organization
Modules directives are sorted into the following order:
@shortdoc@moduledoc(adds@moduledoc false)@behaviouruseimport(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)
endAfter
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
endIf 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.BarAlias Lifting
When a module with three parts is referenced two or more times, styler 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
Styler 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.
You can specify additional modules to exclude from lifting via the :alias_lifting_exclude configuration option. For the example above, the following configuration would keep Styler from creating the alias A.B.C node:
# .formatter.exs
[
plugins: [Styler],
styler: [alias_lifting_exclude: [:C]],
]