Skip to content

Commit

Permalink
Fix false positive mix target change detection
Browse files Browse the repository at this point in the history
Fixes #901
  • Loading branch information
lukaszsamson committed Aug 13, 2023
1 parent acd31ab commit 6c68865
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 16 deletions.
7 changes: 6 additions & 1 deletion apps/language_server/lib/language_server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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, %{}}
Expand Down
31 changes: 18 additions & 13 deletions apps/language_server/lib/language_server/server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
]

Expand Down Expand Up @@ -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", [])
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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(
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 6c68865

Please sign in to comment.