diff --git a/.dialyzer_ignore.exs b/.dialyzer_ignore.exs index fe51488c7..cced6a52a 100644 --- a/.dialyzer_ignore.exs +++ b/.dialyzer_ignore.exs @@ -1 +1,3 @@ -[] +[ + {"lib/language_server/providers/execute_command/restart.ex", :no_return} +] diff --git a/apps/language_server/.dialyzer_ignore.exs b/apps/language_server/.dialyzer_ignore.exs new file mode 100644 index 000000000..cced6a52a --- /dev/null +++ b/apps/language_server/.dialyzer_ignore.exs @@ -0,0 +1,3 @@ +[ + {"lib/language_server/providers/execute_command/restart.ex", :no_return} +] diff --git a/apps/language_server/lib/language_server/providers/execute_command.ex b/apps/language_server/lib/language_server/providers/execute_command.ex index 174f291a1..63b9fdc27 100644 --- a/apps/language_server/lib/language_server/providers/execute_command.ex +++ b/apps/language_server/lib/language_server/providers/execute_command.ex @@ -3,29 +3,31 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand do Adds a @spec annotation to the document when the user clicks on a code lens. """ - @callback execute([any], %ElixirLS.LanguageServer.Server{}) :: - {:ok, any} | {:error, atom, String.t()} - - def execute(command, args, state) do - handler = - case command do - "spec:" <> _ -> - ElixirLS.LanguageServer.Providers.ExecuteCommand.ApplySpec + alias ElixirLS.LanguageServer.Providers.ExecuteCommand - "expandMacro:" <> _ -> - ElixirLS.LanguageServer.Providers.ExecuteCommand.ExpandMacro + @handlers %{ + "spec" => ExecuteCommand.ApplySpec, + "expandMacro" => ExecuteCommand.ExpandMacro, + "manipulatePipes" => ExecuteCommand.ManipulatePipes, + "restart" => ExecuteCommand.Restart + } - "manipulatePipes:" <> _ -> - ElixirLS.LanguageServer.Providers.ExecuteCommand.ManipulatePipes - - _ -> - nil - end + @callback execute([any], %ElixirLS.LanguageServer.Server{}) :: + {:ok, any} | {:error, atom, String.t()} - if handler do + def execute(command_with_server_id, args, state) do + with [command, _server_id] <- String.split(command_with_server_id, ":"), + handler when not is_nil(handler) <- Map.get(@handlers, command) do handler.execute(args, state) else - {:error, :invalid_request, nil} + _ -> + {:error, :invalid_request, nil} + end + end + + def get_commands(server_instance_id) do + for {k, _v} <- @handlers do + "#{k}:#{server_instance_id}" end end end diff --git a/apps/language_server/lib/language_server/providers/execute_command/restart.ex b/apps/language_server/lib/language_server/providers/execute_command/restart.ex new file mode 100644 index 000000000..613c19bdf --- /dev/null +++ b/apps/language_server/lib/language_server/providers/execute_command/restart.ex @@ -0,0 +1,8 @@ +defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.Restart do + @behaviour ElixirLS.LanguageServer.Providers.ExecuteCommand + + @impl ElixirLS.LanguageServer.Providers.ExecuteCommand + def execute(_args, _state) do + System.halt(0) + end +end diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index 43b968a86..07bb14a94 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -810,11 +810,7 @@ defmodule ElixirLS.LanguageServer.Server do "documentOnTypeFormattingProvider" => %{"firstTriggerCharacter" => "\n"}, "codeLensProvider" => %{"resolveProvider" => false}, "executeCommandProvider" => %{ - "commands" => [ - "spec:#{server_instance_id}", - "expandMacro:#{server_instance_id}", - "manipulatePipes:#{server_instance_id}" - ] + "commands" => ExecuteCommand.get_commands(server_instance_id) }, "workspace" => %{ "workspaceFolders" => %{"supported" => false, "changeNotifications" => false}