Using Dialyzer
Learn what Dialyzer is and how it works with typespecs.
We'll cover the following
Introduction
Dialyzer analyzes code that runs on the Erlang VM, looking for potential errors. To use it with Elixir, we have to compile our source into .beam
files and make sure that the debug_info
compiler option is set (which it is when running mix
in the default development mode). Let’s see how to do that by creating a trivial project with two source files.
$ mix new simple
...
$ cd simple
Inside the project, let’s create a simple function. We haven’t implemented the body yet.
defmodule Simple do
@type atom_list :: list(atom)
@spec count_atoms(atom_list) :: non_neg_integer
def count_atoms(list) do
# ...
end
end
Let’s run Dialyzer on our code. To make life simple, we’ll use the dialyxir
library to add a dialyzer
task to mix
:
defp deps do
[
{ :dialyxir, "~> 0.5", only: [:dev], runtime: false }
]
end
Next, we fetch the library and build our project:
$ mix deps.get
$ mix compile
Now we’re ready to analyze our code. However, the first time we do this, dialyzer
needs to construct a massive data structure containing all the types and APIs in both Erlang and Elixir. This lets it check not just our code but also that our code is interacting correctly with the rest of the world. Building this data structure is slow; expect it to take 10 to 20 minutes! But once done, it won’t be repeated.
Get hands-on with 1400+ tech skills courses.