Skip to content

Commit 77e6687

Browse files
committed
Handle Kernel.in/2 in type system instead of using rewrite rules, closes #15130
1 parent de4b161 commit 77e6687

5 files changed

Lines changed: 19 additions & 3 deletions

File tree

lib/elixir/lib/kernel.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4711,8 +4711,6 @@ defmodule Kernel do
47114711
end
47124712

47134713
[head | tail] = list ->
4714-
# We only expand lists in the body if they are relatively
4715-
# short and it is made only of literal expressions.
47164714
case in_body? do
47174715
false -> in_list(left, head, tail, expand, list)
47184716
true -> quote(do: :lists.member(unquote(left), unquote(right)))

lib/elixir/lib/module/types/apply.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,6 +2021,10 @@ defmodule Module.Types.Apply do
20212021

20222022
alias Inspect.Algebra, as: IA
20232023

2024+
defp type_comparison_to_string(:lists, :member, left, right) do
2025+
type_comparison_to_string(Kernel, :in, left, right)
2026+
end
2027+
20242028
defp type_comparison_to_string(mod, fun, left, right) do
20252029
{_, fun, _, _} = :elixir_rewrite.erl_to_ex(mod, fun, [left, right])
20262030

lib/elixir/lib/module/types/helpers.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,13 @@ defmodule Module.Types.Helpers do
329329
end
330330
end
331331

332+
{{:., _, [:lists, :member]}, meta, [expr, [_ | _] = args]} = call ->
333+
if Enum.any?(args, &match?({:|, _, [_, _]}, &1)) do
334+
call
335+
else
336+
{:in, meta, [expr, args]}
337+
end
338+
332339
{{:., _, [Elixir.String.Chars, :to_string]}, meta, [arg]} ->
333340
{:to_string, meta, [arg]}
334341

lib/elixir/src/elixir_rewrite.erl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ inline(Mod, Fun, Arity) -> inner_inline(ex_to_erl, Mod, Fun, Arity).
109109
?inline(?kernel, floor, 1, erlang, floor);
110110
?inline(?kernel, 'function_exported?', 3, erlang, function_exported);
111111
?inline(?kernel, hd, 1, erlang, hd);
112-
?inline(?kernel, in, 2, lists, member);
113112
?inline(?kernel, is_atom, 1, erlang, is_atom);
114113
?inline(?kernel, is_binary, 1, erlang, is_binary);
115114
?inline(?kernel, is_bitstring, 1, erlang, is_bitstring);

lib/elixir/test/elixir/kernel/guard_test.exs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,14 @@ defmodule Kernel.GuardTest do
483483
"""
484484
end
485485

486+
defguard in_list(a) when Kernel.in(a, [:test])
487+
488+
test "expands remote functions" do
489+
assert expand_defguard_to_string(:in_list, [:not_test], :guard) == """
490+
:erlang.\"=:=\"(:not_test, :test)
491+
"""
492+
end
493+
486494
defp expand_defguard_to_string(fun, args, context) do
487495
{{:., [], [__MODULE__, fun]}, [], args}
488496
|> Macro.expand(%{__ENV__ | context: context})

0 commit comments

Comments
 (0)