@@ -12,23 +12,35 @@ defmodule ExactoKnife.Refactorings.Rename do
12
12
IO . puts ( "Couldn't find a variable at #{ inspect ( cursor ) } ." )
13
13
zipper
14
14
15
- { { current_name , _ , _ } , _ } ->
16
- rename_instances ( zipper , current_name , String . to_atom ( new_name ) )
15
+ { { current_name , _ , _ } , _ } = pos_zipper ->
16
+ scope = Ze . find_up ( pos_zipper , & lexical_scope? / 1 ) || zipper
17
+ rename_instances ( scope , current_name , String . to_atom ( new_name ) )
17
18
end
18
19
end
19
20
20
21
def rename_instances ( zipper , current_name , new_name ) do
21
22
zipper
22
23
|> Z . traverse ( fn
23
- { { marker , _ , _ } = node , _ } = z when is_atom ( marker ) ->
24
- if marker == current_name do
25
- Z . replace ( z , put_elem ( node , 0 , new_name ) )
26
- else
27
- z
24
+ { { marker , _ , _ } = node , _ } = z ->
25
+ cond do
26
+ marker == current_name ->
27
+ Z . replace ( z , put_elem ( node , 0 , new_name ) )
28
+
29
+ # skip renaming inside of other scopes
30
+ Ze . safe_node ( zipper ) != Ze . safe_node ( z ) && lexical_scope? ( node ) ->
31
+ Z . skip ( z )
32
+
33
+ true ->
34
+ z
28
35
end
29
36
30
37
z ->
31
38
z
32
39
end )
33
40
end
41
+
42
+ def lexical_scope? ( { :def , _ , _ } ) , do: true
43
+ def lexical_scope? ( { :defp , _ , _ } ) , do: true
44
+ def lexical_scope? ( { :test , _ , _ } ) , do: true
45
+ def lexical_scope? ( _ ) , do: false
34
46
end
0 commit comments