Normalisierungen des Elixir-Representers

Ein Überblick über die Normalisierungen, die der Elixir-Representer auf Lösungen anwendet


Der Elixir-Representer wendet eine Reihe von Normalisierungen an. Details findest du im Code oder in den Testdaten.

Kommentare und Docs entfernen

Alle Kommentare, Docs, Moduledocs und Typedocs werden entfernt.

Davor

defmodule Fake do
  @moduledoc """
  Fake module to demonstrate stuff
  """

  @doc "Not much to see here"
  def foo do
    # TODO: return bar
    nil
  end
end

Danach

defmodule Fake do
  def foo do
    nil
  end
end

Reihenfolge der Imports sortieren

Die Import-Anweisungen am Anfang der Module oder Funktionen werden in dieser Reihenfolge sortiert: alias, use, require, import.

Davor

defmodule Fake do
  import D
  alias A.U.V
  use B
  alias A.{T, S}
  require C

  def foo do
    import Z
    alias X
    use Y
  end

  import NotTouched
  alias NotTouched
end

Danach

defmodule Fake do
  alias A.{S, T}
  alias A.U.V
  use B
  require C
  import D

  def foo do
    alias X
    use Y
    import Z
  end

  import NotTouched
  alias NotTouched
end

Code formatieren

Der Code wird mit [mix code][mix-code] formatiert, wobei do-end-Blöcke erzwungen werden. Alle Funktionen in Pipes werden mit Klammern geschrieben. Typen werden ohne Klammern geschrieben.

Davor

defmodule    Fake   do
        @type foo() :: integer() | atom
def foo, do:    nil |> bar
end

Danach

defmodule Fake do
  @type foo() :: integer | atom
  def foo do
    nil |> bar()
  end
end

Bezeichner normalisieren

Bezeichner werden zu einem Platzhalterwert normalisiert. Einige spezielle Variablen und Modulattribute (_, @spec, __MODULE__ usw.) werden nicht ersetzt. Schlüssel von Maps, Structs und Keyword-Listen werden nicht normalisiert.

Davor

defmodule Fake do
  alias Fake, as: SuperFake
  @my_constant 42

  @impl true
  def foo(bar) when is_integer(bar) do
    bar + @my_constant
  end

  def foo(%{a: a} = bar) do
    %{bar | a: a + @my_constant}
  end

  def foo(_), do: nil
end

Danach

defmodule Placeholder_1 do
  alias Placeholder_1, as: Placeholder_2
  @placeholder_6 42
  @impl true
  def placeholder_4(placeholder_5) when is_integer(placeholder_5) do
    placeholder_5 + @placeholder_6
  end

  def placeholder_4(%{a: placeholder_7} = placeholder_5) do
    %{placeholder_5 | a: placeholder_7 + @placeholder_6}
  end

  def placeholder_4(_) do
    nil
  end
end

Schlüssel in Maps und Structs sortieren

Schlüssel in Maps und Structs werden sortiert. Schlüssel in Keyword-Listen werden nicht sortiert.

Davor

defmodule Fake do
  def foo do
    %MyStruct{z: 3, y: 2, x: 1}
    m = %{c: 3, a: 1, b: 2}
    %{m | b: 20, a: 10}
    [b: 2, a: 1]
  end
end

Danach

defmodule Fake do
  def foo do
    %MyStruct{x: 1, y: 2, z: 3}
    placeholder_3 = %{a: 1, b: 2, c: 3}
    %{placeholder_3 | a: 10, b: 20}
    [b: 2, a: 1]
  end
end