Skip to content

Commit 5d75c5c

Browse files
author
José Valim
committed
Refactor and add new rewrite rules
Signed-off-by: José Valim <[email protected]>
1 parent db4089c commit 5d75c5c

File tree

4 files changed

+239
-186
lines changed

4 files changed

+239
-186
lines changed

lib/elixir/lib/kernel.ex

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1813,7 +1813,9 @@ defmodule Kernel do
18131813
end
18141814

18151815
defp unnest({{:., _, [expr, key]}, _, []}, acc, kind)
1816-
when is_tuple(expr) and elem(expr, 0) != :__aliases__ and elem(expr, 0) != :__MODULE__ do
1816+
when is_tuple(expr) and
1817+
:erlang.element(1, expr) != :__aliases__ and
1818+
:erlang.element(1, expr) != :__MODULE__ do
18171819
unnest(expr, [{:map, key}|acc], kind)
18181820
end
18191821

@@ -1834,8 +1836,8 @@ defmodule Kernel do
18341836

18351837
defp proper_start?({{:., _, [expr, _]}, _, _args})
18361838
when is_atom(expr)
1837-
when elem(expr, 0) == :__aliases__
1838-
when elem(expr, 0) == :__MODULE__, do: true
1839+
when :erlang.element(1, expr) == :__aliases__
1840+
when :erlang.element(1, expr) == :__MODULE__, do: true
18391841

18401842
defp proper_start?({atom, _, _args})
18411843
when is_atom(atom), do: true
@@ -2057,7 +2059,7 @@ defmodule Kernel do
20572059
end
20582060

20592061
defp warn_info([entry|_]) do
2060-
opts = elem(entry, tuple_size(entry) - 1)
2062+
opts = :erlang.element(tuple_size(entry), entry)
20612063
Exception.format_file_line(Keyword.get(opts, :file), Keyword.get(opts, :line)) <> " "
20622064
end
20632065

lib/elixir/src/elixir_dispatch.erl

Lines changed: 7 additions & 181 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,7 @@
99
find_import/4, format_error/1]).
1010
-include("elixir.hrl").
1111
-import(ordsets, [is_element/2]).
12-
13-
-define(atom, 'Elixir.Atom').
14-
-define(float, 'Elixir.Float').
15-
-define(io, 'Elixir.IO').
16-
-define(integer, 'Elixir.Integer').
1712
-define(kernel, 'Elixir.Kernel').
18-
-define(list, 'Elixir.List').
19-
-define(map, 'Elixir.Map').
20-
-define(node, 'Elixir.Node').
21-
-define(port, 'Elixir.Port').
22-
-define(process, 'Elixir.Process').
23-
-define(string, 'Elixir.String').
24-
-define(system, 'Elixir.System').
25-
-define(tuple, 'Elixir.Tuple').
2613

2714
default_functions() ->
2815
[{?kernel, elixir_imported_functions()}].
@@ -82,7 +69,7 @@ remote_function(Meta, Receiver, Name, Arity, E) ->
8269
check_deprecation(Meta, Receiver, Name, Arity, E),
8370

8471
elixir_lexical:record_remote(Receiver, ?m(E, lexical_tracker)),
85-
case inline(Receiver, Name, Arity) of
72+
case elixir_rewrite:inline(Receiver, Name, Arity) of
8673
{AR, AN} -> {remote, AR, AN, Arity};
8774
false -> {remote, Receiver, Name, Arity}
8875
end.
@@ -103,9 +90,9 @@ dispatch_import(Meta, Name, Args, E, Callback) ->
10390
dispatch_require(Meta, Receiver, Name, Args, E, Callback) when is_atom(Receiver) ->
10491
Arity = length(Args),
10592

106-
case rewrite(Receiver, Name, Args, Arity) of
107-
{ok, AR, AN, AA} ->
108-
Callback(AR, AN, AA);
93+
case elixir_rewrite:inline(Receiver, Name, Arity) of
94+
{AR, AN} ->
95+
Callback(AR, AN, Args);
10996
false ->
11097
case expand_require(Meta, Receiver, {Name, Arity}, Args, E) of
11198
{ok, Receiver, Quoted} -> expand_quoted(Meta, Receiver, Name, Arity, Quoted, E);
@@ -151,11 +138,7 @@ do_expand_import(Meta, {Name, Arity} = Tuple, Args, Module, E, Result) ->
151138
{function, Receiver} ->
152139
elixir_lexical:record_import(Receiver, ?m(E, lexical_tracker)),
153140
elixir_locals:record_import(Tuple, Receiver, Module, ?m(E, function)),
154-
155-
case rewrite(Receiver, Name, Args, Arity) of
156-
{ok, _, _, _} = Res -> Res;
157-
false -> {ok, Receiver, Name, Args}
158-
end;
141+
{ok, Receiver, Name, Args};
159142
{macro, Receiver} ->
160143
check_deprecation(Meta, Receiver, Name, Arity, E),
161144
elixir_lexical:record_import(Receiver, ?m(E, lexical_tracker)),
@@ -167,8 +150,8 @@ do_expand_import(Meta, {Name, Arity} = Tuple, Args, Module, E, Result) ->
167150
error -> {ok, Receiver, Name, Args}
168151
end;
169152
false when Module == ?kernel ->
170-
case rewrite(Module, Name, Args, Arity) of
171-
{ok, _, _, _} = Res -> Res;
153+
case elixir_rewrite:inline(Module, Name, Arity) of
154+
{AR, AN} -> {ok, AR, AN, Args};
172155
false -> error
173156
end;
174157
false ->
@@ -342,163 +325,6 @@ elixir_imported_macros() ->
342325
error:undef -> []
343326
end.
344327

345-
rewrite(?atom, to_string, [Arg], _) ->
346-
{ok, erlang, atom_to_binary, [Arg, utf8]};
347-
rewrite(?kernel, elem, [Tuple, Index], _) ->
348-
{ok, erlang, element, [increment(Index), Tuple]};
349-
rewrite(?kernel, put_elem, [Tuple, Index, Value], _) ->
350-
{ok, erlang, setelement, [increment(Index), Tuple, Value]};
351-
rewrite(?map, 'has_key?', [Map, Key], _) ->
352-
{ok, maps, is_key, [Key, Map]};
353-
rewrite(?map, fetch, [Map, Key], _) ->
354-
{ok, maps, find, [Key, Map]};
355-
rewrite(?map, put, [Map, Key, Value], _) ->
356-
{ok, maps, put, [Key, Value, Map]};
357-
rewrite(?map, delete, [Map, Key], _) ->
358-
{ok, maps, remove, [Key, Map]};
359-
rewrite(?process, monitor, [Arg], _) ->
360-
{ok, erlang, monitor, [process, Arg]};
361-
rewrite(?string, to_atom, [Arg], _) ->
362-
{ok, erlang, binary_to_atom, [Arg, utf8]};
363-
rewrite(?string, to_existing_atom, [Arg], _) ->
364-
{ok, erlang, binary_to_existing_atom, [Arg, utf8]};
365-
rewrite(?tuple, insert_at, [Tuple, Index, Term], _) ->
366-
{ok, erlang, insert_element, [increment(Index), Tuple, Term]};
367-
rewrite(?tuple, delete_at, [Tuple, Index], _) ->
368-
{ok, erlang, delete_element, [increment(Index), Tuple]};
369-
rewrite(?tuple, duplicate, [Data, Size], _) ->
370-
{ok, erlang, make_tuple, [Size, Data]};
371-
372-
rewrite(Receiver, Name, Args, Arity) ->
373-
case inline(Receiver, Name, Arity) of
374-
{AR, AN} -> {ok, AR, AN, Args};
375-
false -> false
376-
end.
377-
378-
increment(Number) when is_number(Number) ->
379-
Number + 1;
380-
increment(Other) ->
381-
{{'.', [], [erlang, '+']}, [], [Other, 1]}.
382-
383-
inline(?atom, to_char_list, 1) -> {erlang, atom_to_list};
384-
inline(?io, iodata_length, 1) -> {erlang, iolist_size};
385-
inline(?io, iodata_to_binary, 1) -> {erlang, iolist_to_binary};
386-
inline(?integer, to_string, 1) -> {erlang, integer_to_binary};
387-
inline(?integer, to_string, 2) -> {erlang, integer_to_binary};
388-
inline(?integer, to_char_list, 1) -> {erlang, integer_to_list};
389-
inline(?integer, to_char_list, 2) -> {erlang, integer_to_list};
390-
inline(?float, to_string, 1) -> {erlang, float_to_binary};
391-
inline(?float, to_char_list, 1) -> {erlang, float_to_list};
392-
inline(?list, to_atom, 1) -> {erlang, list_to_atom};
393-
inline(?list, to_existing_atom, 1) -> {erlang, list_to_existing_atom};
394-
inline(?list, to_float, 1) -> {erlang, list_to_float};
395-
inline(?list, to_integer, 1) -> {erlang, list_to_integer};
396-
inline(?list, to_integer, 2) -> {erlang, list_to_integer};
397-
inline(?list, to_tuple, 1) -> {erlang, list_to_tuple};
398-
399-
inline(?kernel, '+', 2) -> {erlang, '+'};
400-
inline(?kernel, '-', 2) -> {erlang, '-'};
401-
inline(?kernel, '+', 1) -> {erlang, '+'};
402-
inline(?kernel, '-', 1) -> {erlang, '-'};
403-
inline(?kernel, '*', 2) -> {erlang, '*'};
404-
inline(?kernel, '/', 2) -> {erlang, '/'};
405-
inline(?kernel, '++', 2) -> {erlang, '++'};
406-
inline(?kernel, '--', 2) -> {erlang, '--'};
407-
inline(?kernel, 'not', 1) -> {erlang, 'not'};
408-
inline(?kernel, '<', 2) -> {erlang, '<'};
409-
inline(?kernel, '>', 2) -> {erlang, '>'};
410-
inline(?kernel, '<=', 2) -> {erlang, '=<'};
411-
inline(?kernel, '>=', 2) -> {erlang, '>='};
412-
inline(?kernel, '==', 2) -> {erlang, '=='};
413-
inline(?kernel, '!=', 2) -> {erlang, '/='};
414-
inline(?kernel, '===', 2) -> {erlang, '=:='};
415-
inline(?kernel, '!==', 2) -> {erlang, '=/='};
416-
inline(?kernel, abs, 1) -> {erlang, abs};
417-
inline(?kernel, apply, 2) -> {erlang, apply};
418-
inline(?kernel, apply, 3) -> {erlang, apply};
419-
inline(?kernel, binary_part, 3) -> {erlang, binary_part};
420-
inline(?kernel, bit_size, 1) -> {erlang, bit_size};
421-
inline(?kernel, byte_size, 1) -> {erlang, byte_size};
422-
inline(?kernel, 'div', 2) -> {erlang, 'div'};
423-
inline(?kernel, exit, 1) -> {erlang, exit};
424-
inline(?kernel, hd, 1) -> {erlang, hd};
425-
inline(?kernel, is_atom, 1) -> {erlang, is_atom};
426-
inline(?kernel, is_binary, 1) -> {erlang, is_binary};
427-
inline(?kernel, is_bitstring, 1) -> {erlang, is_bitstring};
428-
inline(?kernel, is_boolean, 1) -> {erlang, is_boolean};
429-
inline(?kernel, is_float, 1) -> {erlang, is_float};
430-
inline(?kernel, is_function, 1) -> {erlang, is_function};
431-
inline(?kernel, is_function, 2) -> {erlang, is_function};
432-
inline(?kernel, is_integer, 1) -> {erlang, is_integer};
433-
inline(?kernel, is_list, 1) -> {erlang, is_list};
434-
inline(?kernel, is_map, 1) -> {erlang, is_map};
435-
inline(?kernel, is_number, 1) -> {erlang, is_number};
436-
inline(?kernel, is_pid, 1) -> {erlang, is_pid};
437-
inline(?kernel, is_port, 1) -> {erlang, is_port};
438-
inline(?kernel, is_reference, 1) -> {erlang, is_reference};
439-
inline(?kernel, is_tuple, 1) -> {erlang, is_tuple};
440-
inline(?kernel, length, 1) -> {erlang, length};
441-
inline(?kernel, make_ref, 0) -> {erlang, make_ref};
442-
inline(?kernel, map_size, 1) -> {erlang, map_size};
443-
inline(?kernel, max, 2) -> {erlang, max};
444-
inline(?kernel, min, 2) -> {erlang, min};
445-
inline(?kernel, node, 0) -> {erlang, node};
446-
inline(?kernel, node, 1) -> {erlang, node};
447-
inline(?kernel, 'rem', 2) -> {erlang, 'rem'};
448-
inline(?kernel, round, 1) -> {erlang, round};
449-
inline(?kernel, self, 0) -> {erlang, self};
450-
inline(?kernel, send, 2) -> {erlang, send};
451-
inline(?kernel, spawn, 1) -> {erlang, spawn};
452-
inline(?kernel, spawn, 3) -> {erlang, spawn};
453-
inline(?kernel, spawn_link, 1) -> {erlang, spawn_link};
454-
inline(?kernel, spawn_link, 3) -> {erlang, spawn_link};
455-
inline(?kernel, spawn_monitor, 1) -> {erlang, spawn_monitor};
456-
inline(?kernel, spawn_monitor, 3) -> {erlang, spawn_monitor};
457-
inline(?kernel, throw, 1) -> {erlang, throw};
458-
inline(?kernel, tl, 1) -> {erlang, tl};
459-
inline(?kernel, trunc, 1) -> {erlang, trunc};
460-
inline(?kernel, tuple_size, 1) -> {erlang, tuple_size};
461-
462-
inline(?map, keys, 1) -> {maps, keys};
463-
inline(?map, merge, 2) -> {maps, merge};
464-
inline(?map, size, 1) -> {maps, size};
465-
inline(?map, values, 1) -> {maps, values};
466-
inline(?map, to_list, 1) -> {maps, to_list};
467-
468-
inline(?node, spawn, 2) -> {erlang, spawn};
469-
inline(?node, spawn, 3) -> {erlang, spawn_opt};
470-
inline(?node, spawn, 4) -> {erlang, spawn};
471-
inline(?node, spawn, 5) -> {erlang, spawn_opt};
472-
inline(?node, spawn_link, 2) -> {erlang, spawn_link};
473-
inline(?node, spawn_link, 4) -> {erlang, spawn_link};
474-
475-
inline(?process, exit, 2) -> {erlang, exit};
476-
inline(?process, spawn, 2) -> {erlang, spawn_opt};
477-
inline(?process, spawn, 4) -> {erlang, spawn_opt};
478-
inline(?process, demonitor, 1) -> {erlang, demonitor};
479-
inline(?process, demonitor, 2) -> {erlang, demonitor};
480-
inline(?process, link, 1) -> {erlang, link};
481-
inline(?process, unlink, 1) -> {erlang, unlink};
482-
483-
inline(?port, open, 2) -> {erlang, open_port};
484-
inline(?port, call, 3) -> {erlang, port_call};
485-
inline(?port, close, 1) -> {erlang, port_close};
486-
inline(?port, command, 2) -> {erlang, port_command};
487-
inline(?port, command, 3) -> {erlang, port_command};
488-
inline(?port, connect, 2) -> {erlang, port_connect};
489-
inline(?port, control, 3) -> {erlang, port_control};
490-
inline(?port, info, 1) -> {erlang, port_info};
491-
inline(?port, info, 2) -> {erlang, port_info};
492-
inline(?port, list, 0) -> {erlang, ports};
493-
494-
inline(?string, to_float, 1) -> {erlang, binary_to_float};
495-
inline(?string, to_integer, 1) -> {erlang, binary_to_integer};
496-
inline(?string, to_integer, 2) -> {erlang, binary_to_integer};
497-
inline(?system, stacktrace, 0) -> {erlang, get_stacktrace};
498-
inline(?tuple, to_list, 1) -> {erlang, tuple_to_list};
499-
500-
inline(_, _, _) -> false.
501-
502328
check_deprecation(Meta, Receiver, Name, Arity, #{file := File}) ->
503329
case deprecation(Receiver, Name, Arity) of
504330
false -> ok;

lib/elixir/src/elixir_exp.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,8 @@ expand_remote(Receiver, DotMeta, Right, Meta, Args, E, EL) ->
474474
true -> ok
475475
end,
476476
{EArgs, EA} = expand_args(Args, E),
477-
{{{'.', DotMeta, [Receiver, Right]}, Meta, EArgs}, elixir_env:mergev(EL, EA)}.
477+
{elixir_rewrite:rewrite(Receiver, DotMeta, Right, Meta, EArgs),
478+
elixir_env:mergev(EL, EA)}.
478479

479480
%% Lexical helpers
480481

0 commit comments

Comments
 (0)