Hello all,
I’m triing to integrate dialyzer/dialyxer into one project that is using cachex
, but dialyzer keeps reporting some veird error with Cachex.start_link/2
function. I managed to destille minimal example:
defmodule Test do
def hello do
{:ok, _pid} = Cachex.start_link(__MODULE__, stats: true)
end
end
Dialyzer is complaining that
lib/test.ex:3:pattern_match
The pattern can never match the type.
Pattern:
{:ok, __pid}
Type:
:error | :ok | {:error, atom() | {:already_started, pid() | {_, _}}}
But when I tri to run function in iex, it returns {:ok, pid()}
, also when I look at the code, typescpecs seems right and code also, so, how did dialyzer come up with return type :error | :ok | {:error, atom() | {:already_started, pid() | {_, _}}}
? The code for Cachex.start_link/2
looks like this:
@spec start_link(atom | Keyword.t) :: { atom, pid }
def start_link(options) when is_list(options) do
with { :ok, name } <- Keyword.fetch(options, :name),
{ :ok, true } <- ensure_started(),
{ :ok, true } <- ensure_unused(name),
{ :ok, cache } <- setup_env(name, options),
{ :ok, pid } = Supervisor.start_link(__MODULE__, cache, [ name: name ]),
{ :ok, link } = Informant.link(cache),
^link <- Overseer.update(name, link),
do: { :ok, pid }
end
def start_link(name) when not is_atom(name),
do: error(:invalid_name)
def start_link(name),
do: start_link(name: name)
@doc false
@spec start_link(atom(), Keyword.t) :: { atom(), pid() }
def start_link(name, options),
do: start_link([name: name] ++ options)
Anybody have experience with similar problem and how to solve it?