From 6c6886567d4c2f4e0cc16cfaeaf1f278a7edec63 Mon Sep 17 00:00:00 2001 From: Lukasz Samson Date: Sun, 13 Aug 2023 18:43:18 +0200 Subject: [PATCH] Fix false positive mix target change detection Fixes https://github.com/elixir-lsp/elixir-ls/issues/901 --- apps/language_server/lib/language_server.ex | 7 ++++- .../providers/execute_command/restart.ex | 4 +-- .../lib/language_server/server.ex | 31 +++++++++++-------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/apps/language_server/lib/language_server.ex b/apps/language_server/lib/language_server.ex index c8ace2898..ad45bc8cf 100644 --- a/apps/language_server/lib/language_server.ex +++ b/apps/language_server/lib/language_server.ex @@ -29,7 +29,7 @@ defmodule ElixirLS.LanguageServer do @impl Application def stop(_state) do - if ElixirLS.Utils.WireProtocol.io_intercepted?() do + if not Application.get_env(:language_server, :restart, false) and ElixirLS.Utils.WireProtocol.io_intercepted?() do LanguageServer.JsonRpc.show_message( :error, "ElixirLS has crashed. See Output panel." @@ -61,4 +61,9 @@ defmodule ElixirLS.LanguageServer do {ElixirLS.LanguageServer.JsonRpc, name: ElixirLS.LanguageServer.JsonRpc} end end + + def restart() do + Application.put_env(:language_server, :restart, true) + System.stop(0) + 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 index f16f3e23a..d8b932b93 100644 --- a/apps/language_server/lib/language_server/providers/execute_command/restart.ex +++ b/apps/language_server/lib/language_server/providers/execute_command/restart.ex @@ -7,9 +7,9 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.Restart do def execute(_args, _state) do {:ok, _pid} = Task.start(fn -> - Logger.info("ElixirLS will restart") + Logger.info("ElixirLS restart requested") Process.sleep(1000) - System.stop(0) + ElixirLS.LanguageServer.restart() end) {:ok, %{}} diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index 8a7223a80..c2c8b6ba7 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -63,6 +63,8 @@ defmodule ElixirLS.LanguageServer.Server do awaiting_contracts: [], supports_dynamic: false, mix_project?: false, + mix_env: nil, + mix_target: nil, no_mixfile_warned?: false ] @@ -1147,7 +1149,7 @@ defmodule ElixirLS.LanguageServer.Server do Dialyzer.check_support() == :ok && Map.get(settings, "dialyzerEnabled", true) env_vars = Map.get(settings, "envVariables") - mix_env = Map.get(settings, "mixEnv", "test") + mix_env = Map.get(settings, "mixEnv") mix_target = Map.get(settings, "mixTarget") project_dir = Map.get(settings, "projectDir") additional_watched_extensions = Map.get(settings, "additionalWatchedExtensions", []) @@ -1217,11 +1219,11 @@ defmodule ElixirLS.LanguageServer.Server do else JsonRpc.show_message( :warning, - "Environment variables have changed. ElixirLS needs to restart" + "Environment variables change detected. ElixirLS will restart" ) - + # sleep so the client has time to show the message Process.sleep(5000) - System.stop(1) + ElixirLS.LanguageServer.restart() end state @@ -1234,19 +1236,20 @@ defmodule ElixirLS.LanguageServer.Server do end defp set_mix_env(state = %__MODULE__{}, env) do - prev_env = state.settings["mixEnv"] + prev_env = state.mix_env if is_nil(prev_env) or env == prev_env do System.put_env("MIX_ENV", env) Mix.env(String.to_atom(env)) + %{state | mix_env: env} else JsonRpc.show_message(:warning, "Mix env change detected. ElixirLS will restart.") + # sleep so the client has time to show the message Process.sleep(5000) - System.stop(0) + ElixirLS.LanguageServer.restart() + state end - - state end defp set_mix_target(state = %__MODULE__{}, target) when target in [nil, ""] do @@ -1255,19 +1258,20 @@ defmodule ElixirLS.LanguageServer.Server do end defp set_mix_target(state = %__MODULE__{}, target) do - prev_target = state.settings["mixTarget"] + prev_target = state.mix_target if is_nil(prev_target) or target == prev_target do System.put_env("MIX_TARGET", target) Mix.target(String.to_atom(target)) + %{state | mix_target: target} else JsonRpc.show_message(:warning, "Mix target change detected. ElixirLS will restart") + # sleep so the client has time to show the message Process.sleep(5000) - System.stop(0) + ElixirLS.LanguageServer.restart() + state end - - state end defp set_project_dir( @@ -1299,8 +1303,9 @@ defmodule ElixirLS.LanguageServer.Server do "Project directory change detected. ElixirLS will restart" ) + # sleep so the client has time to show the message Process.sleep(5000) - System.stop(0) + ElixirLS.LanguageServer.restart() true -> state