Skip to content

Commit 23982cb

Browse files
committed
Type Tuple.duplicate/2
1 parent 9598d55 commit 23982cb

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ defmodule Module.Types.Descr do
7070
def non_empty_list(type, tail \\ @empty_list), do: list_descr(type, tail, false)
7171
def open_map(), do: %{map: @map_top}
7272
def open_map(pairs), do: map_descr(:open, pairs)
73-
def open_tuple(elements), do: tuple_descr(:open, elements)
73+
def open_tuple(elements, _fallback \\ term()), do: tuple_descr(:open, elements)
7474
def pid(), do: %{bitmap: @bit_pid}
7575
def port(), do: %{bitmap: @bit_port}
7676
def reference(), do: %{bitmap: @bit_reference}

lib/elixir/lib/module/types/of.ex

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -326,14 +326,7 @@ defmodule Module.Types.Of do
326326
end
327327
end
328328

329-
def apply(
330-
:erlang,
331-
:delete_element,
332-
[_, tuple],
333-
{_, meta, [index, _]} = expr,
334-
stack,
335-
context
336-
)
329+
def apply(:erlang, :delete_element, [_, tuple], {_, meta, [index, _]} = expr, stack, context)
337330
when is_integer(index) do
338331
case tuple_delete_at(tuple, index - 1) do
339332
value_type when is_descr(value_type) ->
@@ -344,6 +337,11 @@ defmodule Module.Types.Of do
344337
end
345338
end
346339

340+
def apply(:erlang, :make_tuple, [_, elem], {_, _meta, [size, _]}, _stack, context)
341+
when is_integer(size) and size >= 0 do
342+
{tuple(List.duplicate(elem, size)), context}
343+
end
344+
347345
def apply(:erlang, name, [left, right], expr, stack, context)
348346
when name in [:>=, :"=<", :>, :<, :min, :max] do
349347
result = if name in [:min, :max], do: union(left, right), else: boolean()

lib/elixir/test/elixir/module/types/expr_test.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,13 @@ defmodule Module.Types.ExprTest do
364364
{:ok, integer()}
365365
"""}
366366
end
367+
368+
test "duplicate/2" do
369+
assert typecheck!(Tuple.duplicate(123, 0)) == tuple([])
370+
assert typecheck!(Tuple.duplicate(123, 1)) == tuple([integer()])
371+
assert typecheck!(Tuple.duplicate(123, 2)) == tuple([integer(), integer()])
372+
assert typecheck!([x], Tuple.duplicate(x, 2)) == dynamic(tuple([term(), term()]))
373+
end
367374
end
368375

369376
describe "maps/structs" do

0 commit comments

Comments
 (0)