/ex_type

A type checker for Elixir

Primary LanguageElixirMIT LicenseMIT

ExType

A type checker for Elixir.

Feature

  • gradual typing
  • type check for protocols and generic protocols
  • type check with intersection and union types
  • type guards
  • type assertion
  • type inspection

Installation

The package can be installed by adding ex_type to your list of dependencies in mix.exs:

def deps do
  [
    # Required developement dependency
    {:ex_type, "~> 0.5.0", only: :dev, runtime: false},

    # Optional runtime dependency
    {:ex_type_runtime, "~> 0.2.0"}
  ]
end

Rules

To help ExType infer types, following rules are required:

  1. All public functions require explicit typespecs.

  2. All recursive functions require explicit typespecs.

Basically, you do not need to add a typespec for non-recursive private functions.

Usage

# type check for all code
$ mix type

# type check for specified module
$ mix type ExType.Example.Foo

# type check for specified named function
$ mix type ExType.Example.Foo.hello

# type check for named function with specified arity
$ mix type ExType.Example.Foo.hello/0

Example

There are some examples in lib/ex_type/example/ directory.

Status

This project is still in a very early stage with active development. You are likely to hit uncovered cases when playing more complex code beyond the examples. Be free to submit a github issue for a bug report or any feedback.

Roadmap

Plan to apply ExType to following small-sized libraries first:

Development Note

  • Use MIX_ENV=test iex -S mix to access test context.

  • It uses serveral Elixir private APIs. It should be ok for now because ex_type is a development dependency, not a runtime dependency. Would like to reduce private API usage at later time when the project is more mature.

License

MIT