Skip to content

Commit 9b388a5

Browse files
committed
Reuse logic on exception blame and types errors
1 parent 29858c9 commit 9b388a5

File tree

3 files changed

+20
-26
lines changed

3 files changed

+20
-26
lines changed

lib/elixir/lib/exception.ex

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,13 @@ defmodule Exception do
267267
blame_guard(right, scope, binding)
268268
]
269269

270-
{rewrite_guard_call(op), meta, guards}
270+
kernel_op =
271+
case op do
272+
:orelse -> :or
273+
:andalso -> :and
274+
end
275+
276+
{kernel_op, meta, guards}
271277
end
272278

273279
defp blame_guard(ex_guard, scope, binding) do
@@ -286,32 +292,17 @@ defmodule Exception do
286292

287293
defp rewrite_guard(guard) do
288294
Macro.prewalk(guard, fn
289-
{{:., _, [:erlang, :element]}, _, [{{:., _, [:erlang, :+]}, _, [int, 1]}, arg]} ->
290-
{:elem, [], [arg, int]}
291-
292-
{{:., _, [:erlang, :element]}, _, [int, arg]} when is_integer(int) ->
293-
{:elem, [], [arg, int - 1]}
294-
295-
{:., _, [:erlang, call]} ->
296-
rewrite_guard_call(call)
297-
298-
other ->
299-
other
295+
{{:., _, [mod, fun]}, meta, args} -> erl_to_ex(mod, fun, args, meta)
296+
other -> other
300297
end)
301298
end
302299

303-
defp rewrite_guard_call(:orelse), do: :or
304-
defp rewrite_guard_call(:andalso), do: :and
305-
defp rewrite_guard_call(:"=<"), do: :<=
306-
defp rewrite_guard_call(:"/="), do: :!=
307-
defp rewrite_guard_call(:"=:="), do: :===
308-
defp rewrite_guard_call(:"=/="), do: :!==
309-
310-
defp rewrite_guard_call(op) when op in [:band, :bor, :bnot, :bsl, :bsr, :bxor],
311-
do: {:., [], [Bitwise, op]}
312-
313-
defp rewrite_guard_call(op) when op in [:xor, :element, :size], do: {:., [], [:erlang, op]}
314-
defp rewrite_guard_call(op), do: op
300+
defp erl_to_ex(mod, fun, args, meta) do
301+
case :elixir_rewrite.erl_to_ex(mod, fun, args) do
302+
{Kernel, fun, args} -> {fun, meta, args}
303+
{mod, fun, args} -> {{:., [], [mod, fun]}, meta, args}
304+
end
305+
end
315306

316307
defp blame_wrap(match?, ast), do: %{match?: match?, node: ast}
317308

lib/elixir/lib/module/types.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,6 @@ defmodule Module.Types do
470470

471471
defp reverse_rewrite(guard) do
472472
Macro.prewalk(guard, fn
473-
{:., _, [:erlang, :orelse]} -> :or
474-
{:., _, [:erlang, :andalso]} -> :and
475473
{{:., _, [mod, fun]}, meta, args} -> erl_to_ex(mod, fun, args, meta)
476474
other -> other
477475
end)

lib/elixir/src/elixir_rewrite.erl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,11 @@ inner_rewrite(erl_to_ex, _Meta, erlang, element, [{{'.', _, [erlang, '+']}, _, [
276276
inner_rewrite(erl_to_ex, _Meta, erlang, setelement, [{{'.', _, [erlang, '+']}, _, [Index, 1]}, Tuple, Value]) ->
277277
{?kernel, put_elem, [Tuple, Index, Value]};
278278

279+
inner_rewrite(erl_to_ex, _Meta, erlang, 'orelse', [_, _] = Args) ->
280+
{?kernel, 'or', Args};
281+
inner_rewrite(erl_to_ex, _Meta, erlang, 'andalso', [_, _] = Args) ->
282+
{?kernel, 'and', Args};
283+
279284
inner_rewrite(_To, _Meta, Mod, Fun, Args) -> {Mod, Fun, Args}.
280285

281286
increment(_Meta, Number) when is_number(Number) ->

0 commit comments

Comments
 (0)