Skip to content

Commit 71e2252

Browse files
committed
Unpack __block__ in type specs
Fixes #827
1 parent f66206b commit 71e2252

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

lib/elixir/lib/kernel/typespec.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,8 @@ defmodule Kernel.Typespec do
559559
end
560560

561561
# Handle funs
562+
563+
defp typespec
562564
defp typespec({:->, meta, [{[{:fun, _, arguments}], return}]}, vars, caller) when is_list(arguments) do
563565
typespec({:->, meta, [{arguments, return}]}, vars, caller)
564566
end
@@ -608,6 +610,12 @@ defmodule Kernel.Typespec do
608610
{ :type, line(meta), :tuple, args }
609611
end
610612

613+
# Handle blocks
614+
615+
defp typespec({:__block__, _meta, [arg]}, vars, caller) do
616+
typespec(arg, vars, caller)
617+
end
618+
611619
# Handle variables or local calls
612620
defp typespec({name, meta, atom}, vars, caller) when is_atom(atom) do
613621
if List.member?(vars, name) do

lib/elixir/test/elixir/typespec_test.exs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,19 @@ defmodule Typespec.TypeTest do
318318
] = Enum.sort(specs)
319319
end
320320

321+
test "block handling" do
322+
spec =
323+
test_module do
324+
spec = @spec foo((() -> [ integer ])) :: integer
325+
def foo(_), do: 1
326+
spec
327+
end
328+
assert {{:foo,1},
329+
{:type,_,:fun,[{:type,_,:product,[
330+
{:type,_,:fun,[{:type,_,:product,[]},{:type,_,:list,[{:type,_,:integer,[]}]}]}]},
331+
{:type,_,:integer,[]}]}} = spec
332+
end
333+
321334
# Conversion to AST
322335

323336
test "type_to_ast" do

0 commit comments

Comments
 (0)