Skip to content

Commit d46f0bd

Browse files
authored
Support counter for var context (#9419)
1 parent 1ae0e43 commit d46f0bd

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

lib/elixir/lib/module/types/infer.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,14 @@ defmodule Module.Types.Infer do
827827
context
828828
end
829829

830-
defp var_name({name, _meta, context}), do: {name, context}
830+
defp var_name({name, meta, context}), do: {name, var_context(meta, context)}
831+
832+
defp var_context(meta, context) do
833+
case :lists.keyfind(:counter, 1, meta) do
834+
{:counter, counter} -> counter
835+
false -> context
836+
end
837+
end
831838

832839
# Check if a variable is recursive and incompatible with itself
833840
# Bad: `{var} = var`

lib/elixir/test/elixir/module/types_test.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,30 @@ defmodule Module.TypesTest do
6666
assert quoted_clause([foo]) == {:ok, [{:var, 0}]}
6767
end
6868

69+
test "variable" do
70+
assert quoted_clause([a]) == {:ok, [{:var, 0}]}
71+
assert quoted_clause([a, b]) == {:ok, [{:var, 0}, {:var, 1}]}
72+
assert quoted_clause([a, a]) == {:ok, [{:var, 0}, {:var, 0}]}
73+
assert quoted_clause([a, a]) == {:ok, [{:var, 0}, {:var, 0}]}
74+
75+
assert lift_result(
76+
Types.of_clause([{:a, [], :foo}, {:a, [], :foo}], [], new_stack(), new_context())
77+
) == {:ok, [{:var, 0}, {:var, 0}]}
78+
79+
assert lift_result(
80+
Types.of_clause([{:a, [], :foo}, {:a, [], :bar}], [], new_stack(), new_context())
81+
) == {:ok, [{:var, 0}, {:var, 1}]}
82+
83+
assert lift_result(
84+
Types.of_clause(
85+
[{:a, [counter: 0], :foo}, {:a, [counter: 1], :foo}],
86+
[],
87+
new_stack(),
88+
new_context()
89+
)
90+
) == {:ok, [{:var, 0}, {:var, 1}]}
91+
end
92+
6993
test "assignment" do
7094
assert quoted_clause([x = y, x = y]) == {:ok, [{:var, 0}, {:var, 0}]}
7195
assert quoted_clause([x = y, y = x]) == {:ok, [{:var, 0}, {:var, 0}]}

0 commit comments

Comments
 (0)