Skip to content

Commit 690323e

Browse files
committed
Perform fewer args_to_domain conversions
1 parent 528f8e7 commit 690323e

2 files changed

Lines changed: 20 additions & 17 deletions

File tree

lib/elixir/lib/module/types/descr.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,15 @@ defmodule Module.Types.Descr do
250250
"""
251251
def args_to_domain(types) when is_list(types), do: tuple(types)
252252

253+
@doc """
254+
Converts a list of arguments into a static domain.
255+
256+
If a dynamic type is given, we get its upper bound.
257+
"""
258+
def args_to_static_domain(types) when is_list(types) do
259+
%{tuple: tuple_new(:closed, Enum.map(types, &upper_bound/1))}
260+
end
261+
253262
@doc """
254263
Converts the domain to a list of arguments.
255264

lib/elixir/lib/module/types/pattern.ex

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,17 @@ defmodule Module.Types.Pattern do
2121
defp previous_subtype?(_, []), do: false
2222
defp previous_subtype?([], _), do: true
2323

24-
defp previous_subtype?([type], previous),
25-
do: subtype?(type, Enum.reduce(previous, none(), &union(&2, hd(&1))))
26-
27-
defp previous_subtype?(args, previous) do
28-
subtype?(
29-
args_to_domain(args),
30-
Enum.reduce(previous, none(), &union(&2, args_to_domain(&1)))
31-
)
32-
end
24+
defp previous_subtype?(args, previous),
25+
do: subtype?(args_to_previous(args), Enum.reduce(previous, none(), &union(&2, elem(&1, 1))))
3326

3427
defp concat_previous([], previous),
3528
do: previous
3629

3730
defp concat_previous(types, previous),
38-
do: [types | previous]
31+
do: [{types, args_to_previous(types)} | previous]
32+
33+
defp args_to_previous([type]), do: upper_bound(type)
34+
defp args_to_previous(types), do: args_to_static_domain(types)
3935

4036
defp of_pattern_previous(types, [], _trees, _pattern_info, _tag, _stack, _context) do
4137
{:ok, types}
@@ -45,11 +41,11 @@ defmodule Module.Types.Pattern do
4541
types =
4642
case types do
4743
[type] ->
48-
[Enum.reduce(previous, type, &difference(&2, hd(&1)))]
44+
[Enum.reduce(previous, type, &difference(&2, elem(&1, 1)))]
4945

5046
[_ | _] ->
5147
previous
52-
|> Enum.reduce(args_to_domain(types), &difference(&2, args_to_domain(&1)))
48+
|> Enum.reduce(args_to_domain(types), &difference(&2, elem(&1, 1)))
5349
|> domain_to_flat_args(types)
5450
end
5551

@@ -63,9 +59,9 @@ defmodule Module.Types.Pattern do
6359
end
6460

6561
defp previous_to_string(previous) do
66-
Enum.map_join(previous, "\n ", fn types ->
62+
Enum.map_join(previous, "\n ", fn {types, _} ->
6763
types
68-
|> Enum.map_join(", ", &to_quoted_string/1)
64+
|> Enum.map_join(", ", &(&1 |> upper_bound() |> to_quoted_string()))
6965
|> indent(4)
7066
end)
7167
end
@@ -269,9 +265,7 @@ defmodule Module.Types.Pattern do
269265

270266
defp trees_to_args_types(trees, stack, context) do
271267
Enum.map(trees, fn {tree, _, _} ->
272-
tree
273-
|> of_pattern_tree(stack, context)
274-
|> upper_bound()
268+
of_pattern_tree(tree, stack, context)
275269
end)
276270
end
277271

0 commit comments

Comments
 (0)