Skip to content

Commit 8e455b7

Browse files
committed
More type checking
1 parent f43b476 commit 8e455b7

File tree

4 files changed

+27
-10
lines changed

4 files changed

+27
-10
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ TODO.
66

77
* Type checking and inference of patterns
88

9-
* [Support for tuples and lists as composite types](https://elixir-lang.org/blog/2024/08/28/typing-lists-and-tuples/).
9+
* [Support for tuples and lists as composite types](https://elixir-lang.org/blog/2024/08/28/typing-lists-and-tuples/) as well as type checking of its basic operations from Kernel
1010

11-
* Type checking of `elem/2`, `hd/1`, and `tl/1` in `Kernel`
11+
* Type checking of all built-in conversion functions, such as `List.to_integer/1` and `Atom.to_string/1`
1212

1313
* Type checking of all functions in the `Tuple` module
1414

lib/elixir/lib/module/types/of.ex

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,17 +320,36 @@ defmodule Module.Types.Of do
320320
# no overlaps.
321321

322322
for {mod, fun, clauses} <- [
323+
{:binary, :copy, [{[binary(), integer()], binary()}]},
324+
{:erlang, :atom_to_binary, [{[atom()], binary()}]},
325+
{:erlang, :atom_to_list, [{[atom()], list(integer())}]},
326+
{:erlang, :binary_to_atom, [{[binary()], atom()}]},
327+
{:erlang, :binary_to_existing_atom, [{[binary()], atom()}]},
323328
{:erlang, :binary_to_integer, [{[binary()], integer()}]},
329+
{:erlang, :binary_to_integer, [{[binary(), integer()], integer()}]},
330+
{:erlang, :binary_to_float, [{[binary()], float()}]},
324331
{:erlang, :integer_to_binary, [{[integer()], binary()}]},
332+
{:erlang, :integer_to_binary, [{[integer(), integer()], binary()}]},
333+
{:erlang, :integer_to_list, [{[integer()], non_empty_list(integer())}]},
334+
{:erlang, :integer_to_list, [{[integer(), integer()], non_empty_list(integer())}]},
335+
{:erlang, :list_to_atom, [{[list(integer())], atom()}]},
336+
{:erlang, :list_to_existing_atom, [{[list(integer())], atom()}]},
337+
{:erlang, :list_to_float, [{[non_empty_list(integer())], float()}]},
338+
{:erlang, :list_to_integer, [{[non_empty_list(integer())], integer()}]},
339+
{:erlang, :list_to_integer, [{[non_empty_list(integer()), integer()], integer()}]},
340+
{:erlang, :list_to_tuple, [{[list(term())], dynamic(open_tuple([], term()))}]},
325341

326342
# TODO: Replace term()/dynamic() by parametric types
327-
{:erlang, :hd, [{[non_empty_list(term(), term())], dynamic()}]},
328-
{:erlang, :tl, [{[non_empty_list(term(), term())], dynamic()}]},
329343
{:erlang, :delete_element,
330344
[{[integer(), open_tuple([], term())], dynamic(open_tuple([], term()))}]},
345+
{:erlang, :hd, [{[non_empty_list(term(), term())], dynamic()}]},
331346
{:erlang, :element, [{[integer(), open_tuple([], term())], dynamic()}]},
332347
{:erlang, :insert_element,
333-
[{[integer(), open_tuple([], term()), term()], dynamic(open_tuple([], term()))}]}
348+
[{[integer(), open_tuple([], term()), term()], dynamic(open_tuple([], term()))}]},
349+
{:erlang, :setelement,
350+
[{[integer(), open_tuple([], term()), term()], dynamic(open_tuple([], term()))}]},
351+
{:erlang, :tl, [{[non_empty_list(term(), term())], dynamic()}]},
352+
{:erlang, :tuple_to_list, [{[open_tuple([], term())], dynamic(list(term()))}]}
334353
] do
335354
[{args, _return} | _others] = clauses
336355

lib/elixir/src/elixir_rewrite.erl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ inline(Mod, Fun, Arity) -> inner_inline(ex_to_erl, Mod, Fun, Arity).
198198
?inline(?process, unregister, 1, erlang, unregister);
199199

200200
?inline(?string, duplicate, 2, binary, copy);
201+
?inline(?string, to_atom, 1, erlang, binary_to_atom);
202+
?inline(?string, to_existing_atom, 1, erlang, binary_to_existing_atom);
201203
?inline(?string, to_float, 1, erlang, binary_to_float);
202204
?inline(?string, to_integer, 1, erlang, binary_to_integer);
203205
?inline(?string, to_integer, 2, erlang, binary_to_integer);
@@ -208,8 +210,6 @@ inline(Mod, Fun, Arity) -> inner_inline(ex_to_erl, Mod, Fun, Arity).
208210
?inline(?system, time_offset, 0, erlang, time_offset);
209211
?inline(?system, unique_integer, 0, erlang, unique_integer);
210212
?inline(?system, unique_integer, 1, erlang, unique_integer);
211-
212-
?inline(?tuple, append, 2, erlang, append_element);
213213
?inline(?tuple, to_list, 1, erlang, tuple_to_list);
214214

215215
% Defined without macro to avoid conflict with Bitwise named operators
@@ -258,8 +258,6 @@ rewrite(Receiver, DotMeta, Right, Meta, Args) ->
258258
?rewrite(?process, monitor, [Arg, Opts], erlang, monitor, [process, Arg, Opts]);
259259
?rewrite(?process, send_after, [Dest, Msg, Time], erlang, send_after, [Time, Dest, Msg]);
260260
?rewrite(?process, send_after, [Dest, Msg, Time, Opts], erlang, send_after, [Time, Dest, Msg, Opts]);
261-
?rewrite(?string, to_atom, [Arg], erlang, binary_to_atom, [Arg, utf8]);
262-
?rewrite(?string, to_existing_atom, [Arg], erlang, binary_to_existing_atom, [Arg, utf8]);
263261
?rewrite(?tuple, duplicate, [Data, Size], erlang, make_tuple, [Size, Data]);
264262

265263
inner_rewrite(ex_to_erl, Meta, ?tuple, delete_at, [Tuple, Index]) ->

lib/iex/lib/iex/autocomplete.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ defmodule IEx.Autocomplete do
685685

686686
defp hidden_fun?({name, arity}, docs) do
687687
case Enum.find(docs, &match?({{_, ^name, ^arity}, _, _, _, _}, &1)) do
688-
nil -> hd(Atom.to_charlist(name)) == ?_
688+
nil -> match?([?_ | _], Atom.to_charlist(name))
689689
{_, _, _, :hidden, _} -> true
690690
{_, _, _, _, _} -> false
691691
end

0 commit comments

Comments
 (0)