@@ -10,27 +10,30 @@ defmodule ElixirLS.LanguageServer.Experimental.CodeMod.ExtractFunction do
10
10
"""
11
11
def extract_function ( zipper , start_line , end_line , function_name ) do
12
12
{ quoted_after_extract , acc } = extract_lines ( zipper , start_line , end_line , function_name )
13
-
14
- new_function_zipper = new_function ( function_name , [ ] , acc . lines ) |> Z . zip ( )
15
- declared_vars = vars_declared ( new_function_zipper ) |> Enum . uniq ( )
16
- used_vars = vars_used ( new_function_zipper ) |> Enum . uniq ( )
17
-
18
- args = used_vars -- declared_vars
19
- returns = declared_vars |> Enum . filter ( & ( & 1 in acc . vars ) )
20
-
21
- { zipper , extracted } =
22
- add_returned_vars ( Z . zip ( quoted_after_extract ) , returns , function_name , args , acc . lines )
23
-
24
- enclosing = acc . def
25
-
26
- zipper
27
- |> top_find ( fn
28
- { :def , _meta , [ { ^ enclosing , _ , _ } , _ ] } -> true
29
- _ -> false
30
- end )
31
- |> Z . insert_right ( extracted )
32
- |> fix_block ( )
33
- |> Z . root ( )
13
+ if Enum . empty? ( acc . lines ) do
14
+ { :error , :not_extractable }
15
+ else
16
+ new_function_zipper = new_function ( function_name , [ ] , acc . lines ) |> Z . zip ( )
17
+ declared_vars = vars_declared ( new_function_zipper ) |> Enum . uniq ( )
18
+ used_vars = vars_used ( new_function_zipper ) |> Enum . uniq ( )
19
+
20
+ args = used_vars -- declared_vars
21
+ returns = declared_vars |> Enum . filter ( & ( & 1 in acc . vars ) )
22
+
23
+ { zipper , extracted } =
24
+ add_returned_vars ( Z . zip ( quoted_after_extract ) , returns , function_name , args , acc . lines )
25
+
26
+ enclosing = acc . def
27
+
28
+ zipper
29
+ |> top_find ( fn
30
+ { :def , _meta , [ { ^ enclosing , _ , _ } , _ ] } -> true
31
+ _ -> false
32
+ end )
33
+ |> Z . insert_right ( extracted )
34
+ |> fix_block ( )
35
+ |> Z . root ( )
36
+ end
34
37
end
35
38
36
39
@ doc """
0 commit comments