1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
-module(control_test).
-include_lib("eunit/include/eunit.hrl").
to_erl(String) ->
Forms = elixir:'string_to_quoted!'(String, 1, 1, <<"nofile">>, []),
{Expr, _, _, _} = elixir:quoted_to_erl(Forms, elixir:env_for_eval([])),
Expr.
cond_line_test() ->
{'case', 1, _,
[{clause, 2, _, _, _},
{clause, 3, _, _, _}]
} = to_erl("cond do\n 1 -> :ok\n 2 -> :ok\nend").
% Optimized
optimized_if_test() ->
{'case', _, _,
[{clause, _, [{atom, _, false}], [], [{atom, _, 'else'}]},
{clause, _, [{atom, _, true}], [], [{atom, _, do}]}]
} = to_erl("if is_list([]), do: :do, else: :else").
optimized_andand_test() ->
{'case', _, _,
[{clause, _,
[{var, _, Var}],
[[{op, _, 'orelse', _, _}]],
[{var, _, Var}]},
{clause, _, [{var, _, '_'}], [], [{atom, 1, done}]}]
} = to_erl("is_list([]) && :done").
optimized_oror_test() ->
{'case', _, _,
[{clause, 1,
[{var, 1, _}],
[[{op, 1, 'orelse', _, _}]],
[{atom, 1, done}]},
{clause, 1, [{var, 1, Var}], [], [{var, 1, Var}]}]
} = to_erl("is_list([]) || :done").
optimized_and_test() ->
{'case',_, _,
[{clause, _, [{atom, _, false}], [], [{atom, _, false}]},
{clause, _, [{atom, _, true}], [], [{atom, _, done}]}]
} = to_erl("is_list([]) and :done").
optimized_or_test() ->
{'case', _, _,
[{clause, _, [{atom, _, false}], [], [{atom, _, done}]},
{clause, _, [{atom, _, true}], [], [{atom, _, true}]}]
} = to_erl("is_list([]) or :done").
no_after_in_try_test() ->
{'try', _, [_], [], [_], []} = to_erl("try do :foo.bar() catch _ -> :ok end").
optimized_inspect_interpolation_test() ->
{bin, _,
[{bin_element, _,
{call, _, {remote, _,{atom, _, 'Elixir.Kernel'}, {atom, _, inspect}}, [_]},
default, [binary]}]} = to_erl("\"#{inspect(1)}\"").
optimized_map_put_test() ->
{map, _,
[{map_field_assoc, _, {atom, _, a}, {integer, _, 1}},
{map_field_assoc, _, {atom, _, b}, {integer, _, 2}}]
} = to_erl("Map.put(%{a: 1}, :b, 2)").
optimized_map_put_variable_test() ->
{block, _,
[_,
{map, _, {var, _, _},
[{map_field_assoc, _, {atom, _, a}, {integer, _, 1}}]
}]
} = to_erl("x = %{}; Map.put(x, :a, 1)").
optimized_nested_map_put_variable_test() ->
{block, _,
[_,
{map, _, {var, _, _},
[{map_field_assoc, _, {atom, _, a}, {integer, _, 1}},
{map_field_assoc, _, {atom, _, b}, {integer, _, 2}}]
}]
} = to_erl("x = %{}; Map.put(Map.put(x, :a, 1), :b, 2)").
optimized_map_merge_test() ->
{map, _,
[{map_field_assoc, _, {atom, _, a}, {integer, _, 1}},
{map_field_assoc, _, {atom, _, b}, {integer, _, 2}},
{map_field_assoc, _, {atom, _, c}, {integer, _, 3}}]
} = to_erl("Map.merge(%{a: 1, b: 2}, %{c: 3})").
optimized_map_merge_variable_test() ->
{block, _,
[_,
{map, _, {var, _, _},
[{map_field_assoc, _, {atom, _, a}, {integer, _, 1}}]
}]
} = to_erl("x = %{}; Map.merge(x, %{a: 1})").
optimized_map_update_and_merge_test() ->
{block, _,
[_,
{map, _, {var, _, _},
[{map_field_exact, _, {atom, _, a}, {integer, _, 2}},
{map_field_assoc, _, {atom, _, b}, {integer, _, 3}}]
}]
} = to_erl("x = %{a: 1}; Map.merge(%{x | a: 2}, %{b: 3})"),
{block, _,
[_,
{call, _, {remote, _, {atom, _, maps}, {atom, _, merge}},
[{map, _,
[{map_field_assoc, _, {atom, _, a}, {integer, _, 2}}]},
{map, _, {var, _, _},
[{map_field_exact, _, {atom, _, b}, {integer, _, 3}}]}]
}]
} = to_erl("x = %{a: 1}; Map.merge(%{a: 2}, %{x | b: 3})").
optimized_nested_map_merge_variable_test() ->
{block, _,
[_,
{map, _, {var, _, _},
[{map_field_assoc, _, {atom, _, a}, {integer, _, 1}},
{map_field_assoc, _, {atom, _, b}, {integer, _, 2}}]
}]
} = to_erl("x = %{}; Map.merge(Map.merge(x, %{a: 1}), %{b: 2})").
|