Skip to content

Commit 1e69ee4

Browse files
committed
Add extract function as an execute command
1 parent fae8f09 commit 1e69ee4

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
defmodule ElixirLS.LanguageServer.Experimental.CodeMod.RefactorExtractFunction do
2+
alias ElixirLS.LanguageServer.Experimental.CodeMod.Diff
3+
alias ElixirLS.LanguageServer.Experimental.CodeMod.ExtractFunction
4+
5+
alias Sourceror.Zipper
6+
7+
require Logger
8+
9+
def text_edits(original_text, tree, start_line, end_line, new_function_name) do
10+
result =
11+
tree
12+
|> Zipper.zip()
13+
|> ExtractFunction.extract_function(start_line + 1, end_line + 1, new_function_name)
14+
|> Sourceror.to_string()
15+
16+
{:ok, Diff.diff(original_text, result)}
17+
end
18+
end

apps/language_server/lib/language_server/providers/execute_command.ex

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand do
88
@handlers %{
99
"spec" => ExecuteCommand.ApplySpec,
1010
"expandMacro" => ExecuteCommand.ExpandMacro,
11+
"extractFunction" => ExecuteCommand.ExtractFunction,
1112
"manipulatePipes" => ExecuteCommand.ManipulatePipes,
1213
"restart" => ExecuteCommand.Restart,
1314
"mixClean" => ExecuteCommand.MixClean,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.ExtractFunction do
2+
@moduledoc """
3+
This module implements a custom command extract function.
4+
Sends applyEdit request.
5+
"""
6+
7+
alias ElixirLS.LanguageServer.JsonRpc
8+
alias ElixirLS.LanguageServer.Server
9+
alias ElixirLS.LanguageServer.Experimental.CodeMod.Ast
10+
alias ElixirLS.LanguageServer.Experimental.CodeMod.RefactorExtractFunction
11+
12+
require Logger
13+
14+
@behaviour ElixirLS.LanguageServer.Providers.ExecuteCommand
15+
16+
@impl ElixirLS.LanguageServer.Providers.ExecuteCommand
17+
def execute([uri, start_line, end_line, new_function_name], state) do
18+
with source_file <- Server.get_source_file(state, uri),
19+
{:ok, tree} <- Ast.from(source_file.text, include_comments: true),
20+
{:ok, text_edits} <-
21+
RefactorExtractFunction.text_edits(
22+
source_file.text,
23+
tree,
24+
start_line,
25+
end_line,
26+
new_function_name
27+
) do
28+
apply_edits(uri, text_edits)
29+
{:ok, nil}
30+
end
31+
end
32+
33+
def apply_edits(uri, text_edits) do
34+
JsonRpc.send_request("workspace/applyEdit", %{
35+
"label" => "Extract function",
36+
"edit" => %{"changes" => %{uri => text_edits}}
37+
}) |> IO.inspect(label: :rpc_response, limit: :infinity)
38+
end
39+
end

0 commit comments

Comments
 (0)