Skip to content

Commit df2720d

Browse files
committed
fix: connect variable to usage inside when guard
1 parent 48222a4 commit df2720d

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

lib/refactorex/dataflow.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,18 @@ defmodule Refactorex.Dataflow do
7171
{:test, _, scope} ->
7272
analyze_sealed_scope(dataflow, scope)
7373

74+
{:->, _, [[{:when, _, [left, guard]}], right]} ->
75+
analyze_scope(dataflow, left, [guard, right])
76+
7477
{:->, _, [left, right]} ->
7578
analyze_scope(dataflow, left, right)
7679

80+
{:<-, _, [{:when, _, [left, guard]}, right]} ->
81+
dataflow
82+
|> recursive_analyze(right)
83+
|> add_commands(gen_commands(left))
84+
|> recursive_analyze(guard)
85+
7786
{id, _, [left, right]} when id in ~w(= <-)a ->
7887
dataflow
7988
|> recursive_analyze(right)

test/dataflow_test.exs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,33 @@ defmodule Refactorex.DataflowTest do
119119
)
120120
end
121121

122+
test "lists all variables reused by guards" do
123+
assert %{
124+
variable_at(:arg, 2, 3) => [
125+
variable_at(:arg, 10, 17),
126+
variable_at(:arg, 7, 16),
127+
variable_at(:arg, 6, 17)
128+
]
129+
} =
130+
Dataflow.analyze(
131+
"""
132+
defp bar() do
133+
arg = 10
134+
135+
1..30
136+
|> Enum.map(fn
137+
i when i <= arg -> i
138+
i when i > arg -> i + 10
139+
end)
140+
141+
with true when arg > 10 <- true do
142+
end
143+
end
144+
"""
145+
|> Sourceror.parse_string!()
146+
)
147+
end
148+
122149
test "lists all variables after a reassignment" do
123150
assert %{
124151
variable_at(:arg, 1, 9) => [

0 commit comments

Comments
 (0)