We now support all of Elixir's builtin basic types!
We now support all of the remote types of the Elixir standard library!
Support for most of the map-type syntactic sugars.
An optional Credo check to enforce that all your functions have a spec.
Full changelog
Additions
Support for fancier map syntaxes:
%{required(key_type) => value_type} Maps with a single kind of required key-value type.
%{optional(key_type) => value_type} Maps with a single kind of optional key-value type.
%{:some => a(), :fixed => b(), :keys => c(), optional(atom()) => any()} Maps with any number of fixed keys and a single optional key-value type.
TypeCheck now supports nearly all kinds of map types that see use. Archaic combinations of optional and required are not supported, but also not very useful types in practice.
Because of this, the inspection of the builtin type map(key, value) has been changed to look the same as an optional map.
This is a minor backwards-incompatible change.
Desugaring %{} has changed from 'any map' to 'the empty map' in line with Elixir's Typespecs. This is a minor backwards-incompatible change.
Support for the builtin types port(), reference() and (based on these) identifier().
Support for the builtin type struct().
Support for the builtin type timeout().
Support for the builtin type nonempty_charlist() and maybe_improper_list and (based on these) iolist() and iodata().
Adding types depending on these builtins to the default type overrides. We now support all modules of the full standard library!
TypeCheck.Credo.Check.Readability.Specs: an opt-in alternative Credo check which will check whether all functions have either a @spec! or 'normal' @spec. (Fixes #102).
Fixes
The TypeCheck.Builtin module is now actually spectested itself. Some consistency bugs were found and solved as a result.