Skip to main content

W0059: Unavailable Type

Error​

-module(main).
-spec foo() -> dep:nonexistent_type().
%% ^^^^^^^^^^^^^^^^^^^^^^ warning: W0059: Type 'dep:nonexistent_type/0' is not available through dependencies.
foo() -> ok.

Explanation​

This diagnostic warns you when your code references a type that either:

  1. Does not exist (is undefined)
  2. Is not accessible because it's from a module outside your application's dependencies
  3. Exists but is not exported from the defining module

What This Diagnostic Checks​

The diagnostic examines:

  • Type specifications (-spec attributes)
  • Type definitions (-type and -opaque attributes)
  • Callback specifications (-callback attributes)

Which Dependencies Count​

A type reference is erased at compile time, so it needs the defining application's source to be visible to the analysis, not its beam to be loadable at runtime. The reachable set is therefore wider than the one unavailable_function (W0085) uses for calls: alongside applications and included_applications, an application declared in distributed_dependencies counts as reachable. That relation describes an application reached over the network, so it carries no build-system edge and — unlike applications — is allowed to be cyclic.

Reachability is transitive across both kinds of edge, so declaring an application in distributed_dependencies also makes everything that application depends on reachable.

Modules Defined More Than Once​

When several applications define a module with the same name, a remote type reference counts as available if any copy within reach defines the type, not only the copy ELP happens to resolve the module name to.

eqWAlizer Override Modules​

eqwalizer_specs and eqwalizer_types are not checked. They supply eqWAlizer with specs and types for other modules, typically third-party ones their application cannot depend on, so they necessarily name types from outside its dependencies.

How to Fix​

  • Check if the type actually exists
  • Verify the name and arity of the type
  • Add the application that defines the type to your application's dependencies or move the type definition to an application that is already a dependency