Ordering Use, Import, Alias, Require?

Is there a recommended ordering of require, use, import, and alias? Does the style guide have anything to say about the preferred ordering of special forms?

Nevermind, the styleguide is pretty explicit about this: https://github.com/christopheradams/elixir_style_guide#module-attribute-ordering

List module attributes and directives in the following order:

  • @moduledoc
  • @behaviour
  • use
  • import
  • alias
  • require
  • defstruct
  • @type
  • @module_attribute
  • @callback
  • @macrocallback
  • @optional_callbacks

Add a blank line between each grouping, and sort the terms (like module names) alphabetically.

12 Likes

Note that the order of some items have been changed:

  1. @moduledoc
  2. @behaviour
  3. use
  4. import
  5. require
  6. alias
  7. @module_attribute
  8. defstruct
  9. @type
  10. @callback
  11. @macrocallback
  12. @optional_callbacks
  13. defmacro, defmodule, defguard, def, etc.
11 Likes

Does anyone know if mix format takes care of this somehow? Any config I can set to have it auto sort it for me?

I don’t know if it handles ordering all of them but might be able to be extended to do so.

https://hexdocs.pm/recode/Recode.Task.AliasOrder.html

It won‘t ever do that. One premise of the core formatter is that it won‘t change the underlying AST by applying formatting. That ensures that formatting will never introduce a change in behavior of the code and therefore won‘t introduce unintended bugs. Reordering expressions means changing the AST however.

2 Likes

Sound decision, makes total sense. I wish it would reorder still :laughing:

I guess I’ll configure Credo to be extra annoying so my team doesn’t commit unordered aliases. credo --strict --no-really-i-want-strict

Sorry, I meant recode, not the formatter, when I said “it”.