A Static Typechecker for Elixir
While this is under construction, you can check for updates in the issues tracker above ^^
Currently this software is vaporware, at the moment this repo is only the outermost shell and performs no actual typechecking. Considerable work will be going into mavis and mavis_inference before further work happens here.
@Dusty on Elixirforums suggested that I take GitHub sponsorship, so that has been set up. I feel like this funding structure vaguely disincentivizes "get this POC out"-type projects on a timetable, and is more suited for projects that need long-term maintenance. But it's the simplest thing I could do. Accordingly, the sponsorships will be terminated before the end of November. If you'd prefer a different way of leaving me a tip, message me on elixirforums (my gh handle) or the Elixir Slack (my gh handle).
check the issues list for updates
a custom type-system for the beam that is not based on any theoretical typesystems, but is based on experience with the BEAM.
not a DSL in the elixir language (no nonstandard macros in the checked code)
Hooks into the elixir compiler tracer, and has a way of invocation that works even if it should require a tracer message that doesn’t exist yet.
Pluggable
Performance. Expect the first iteration to cause your compilation times to increase.
PLT Caching. This will probably be necessary in future iterations.
defmodule AddFail do
def add(a) do
a + "fail"
end
@after_compile Selectrix.TypeCheck
end
causes the compiler error:
nofile:3: (type error)
function Kernel.+/2 with spec
(integer(), integer()) :: integer()
(float(), float()) :: float()
(integer(), float()) :: float()
(float(), float()) :: float()
called with (a :: any(), "fail" :: <<_::32, _::_*8>>)
defmodule AddWarn do
@spec add(integer | :atom) :: integer
def add(a) do
a + 3
end
@after_compile Selectrix.TypeCheck
end
causes the compiler warning:
warning: input types a :: integer() | atom(), 3 :: 3 may fail with function `Kernel.+/2` with spec
(integer(), integer()) :: integer()
(float(), float()) :: float()
(integer(), float()) :: float()
(float(), float()) :: float()
nofile:4: AddWarn.add/1
The package will be able to be installed by adding selectrix
to your list of
dependencies in mix.exs
:
def deps do
[
{:selectrix, "~> 0.1.0"}
]
end
Docs will be found at https://hexdocs.pm/selectrix.