@@ -6,21 +6,46 @@ defmodule Refactorex.Refactor.Variable do
66 Dataflow
77 }
88
9- def at_one? ( % { node: { name , _ , nil } } = zipper ) do
10- cond do
11- not is_atom ( name ) or name in ~w( binary _) a ->
12- false
9+ defguard is_variable ( node )
10+ when is_tuple ( node ) and
11+ tuple_size ( node ) == 3 and
12+ is_atom ( elem ( node , 0 ) ) and
13+ elem ( node , 0 ) not in ~w( binary _) a and
14+ is_nil ( elem ( node , 2 ) )
1315
14- match? ( % { node: { :@ , _ , _ } } , Z . up ( zipper ) ) ->
15- false
16+ def at_one? ( % { node: node } = zipper ) when is_variable ( node ) ,
17+ do: not match? ( % { node: { :@ , _ , _ } } , Z . up ( zipper ) )
18+
19+ def at_one? ( _zipper ) , do: false
20+
21+ def plain_variables? ( nodes ) , do: Enum . all? ( nodes , & is_variable ( & 1 ) )
1622
17- true ->
23+ def inside_declaration? ( % { node: node } = zipper ) do
24+ case parent = Z . up ( zipper ) do
25+ % { node: { id , _ , [ ^ node , _ ] } } when id in ~w( def defp <- when =) a ->
1826 true
27+
28+ % { node: { :-> , _ , [ ^ node , _ ] } } ->
29+ cond do
30+ match? ( % { node: { :fn , _ , _ } } , Z . up ( parent ) ) -> true
31+ match? ( % { node: { :case , _ , _ } } , AST . up ( parent , 4 ) ) -> true
32+ true -> false
33+ end
34+
35+ % { node: { _ , _ , [ _ | _ ] } } ->
36+ inside_declaration? ( parent )
37+
38+ % { node: [ _ | _ ] } ->
39+ inside_declaration? ( parent )
40+
41+ % { node: { _ , _ } } ->
42+ inside_declaration? ( parent )
43+
44+ _ ->
45+ false
1946 end
2047 end
2148
22- def at_one? ( _zipper ) , do: false
23-
2449 def find_all_references ( zipper , { name , _ , _ } = variable ) do
2550 zipper
2651 |> Z . topmost_root ( )
@@ -48,65 +73,6 @@ defmodule Refactorex.Refactor.Variable do
4873 |> Z . node ( )
4974 end
5075
51- def list_unique_variables ( node , filter_fn \\ fn _zipper -> true end ) do
52- node
53- |> list_variables ( filter_fn )
54- |> Enum . uniq_by ( fn { name , _ , _ } -> name end )
55- end
56-
57- def list_unpinned_variables ( node ) ,
58- do: list_variables ( node , & ( not match? ( % { node: { :^ , _ , _ } } , Z . up ( & 1 ) ) ) )
59-
60- def list_variables ( node , filter_fn \\ fn _zipper -> true end ) do
61- node
62- |> Z . zip ( )
63- |> Z . traverse_while ( [ ] , fn
64- % { node: node } = zipper , variables ->
65- cond do
66- not at_one? ( zipper ) ->
67- { :cont , zipper , variables }
68-
69- not filter_fn . ( zipper ) ->
70- { :cont , zipper , variables }
71-
72- true ->
73- { :cont , zipper , variables ++ [ node ] }
74- end
75- end )
76- |> elem ( 1 )
77- end
78-
79- def member? ( variables , { name , _ , _ } = _variable ) ,
80- do: Enum . any? ( variables , & match? ( { ^ name , _ , _ } , & 1 ) )
81-
82- def member? ( _ , _ ) , do: false
83-
84- def inside_declaration? ( % { node: node } = zipper ) do
85- case parent = Z . up ( zipper ) do
86- % { node: { id , _ , [ ^ node , _ ] } } when id in ~w( def defp <- when =) a ->
87- true
88-
89- % { node: { :-> , _ , [ ^ node , _ ] } } ->
90- cond do
91- match? ( % { node: { :fn , _ , _ } } , Z . up ( parent ) ) -> true
92- match? ( % { node: { :case , _ , _ } } , AST . up ( parent , 4 ) ) -> true
93- true -> false
94- end
95-
96- % { node: { _ , _ , [ _ | _ ] } } ->
97- inside_declaration? ( parent )
98-
99- % { node: [ _ | _ ] } ->
100- inside_declaration? ( parent )
101-
102- % { node: { _ , _ } } ->
103- inside_declaration? ( parent )
104-
105- _ ->
106- false
107- end
108- end
109-
11076 # find &{i} usages and replace them with arg{i}
11177 def turn_captures_into_variables ( node ) do
11278 node
0 commit comments