Skip to content

Commit 6c68865

Browse files
committed
Fix false positive mix target change detection
Fixes #901
1 parent acd31ab commit 6c68865

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

apps/language_server/lib/language_server.ex

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ defmodule ElixirLS.LanguageServer do
2929

3030
@impl Application
3131
def stop(_state) do
32-
if ElixirLS.Utils.WireProtocol.io_intercepted?() do
32+
if not Application.get_env(:language_server, :restart, false) and ElixirLS.Utils.WireProtocol.io_intercepted?() do
3333
LanguageServer.JsonRpc.show_message(
3434
:error,
3535
"ElixirLS has crashed. See Output panel."
@@ -61,4 +61,9 @@ defmodule ElixirLS.LanguageServer do
6161
{ElixirLS.LanguageServer.JsonRpc, name: ElixirLS.LanguageServer.JsonRpc}
6262
end
6363
end
64+
65+
def restart() do
66+
Application.put_env(:language_server, :restart, true)
67+
System.stop(0)
68+
end
6469
end

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ defmodule ElixirLS.LanguageServer.Providers.ExecuteCommand.Restart do
77
def execute(_args, _state) do
88
{:ok, _pid} =
99
Task.start(fn ->
10-
Logger.info("ElixirLS will restart")
10+
Logger.info("ElixirLS restart requested")
1111
Process.sleep(1000)
12-
System.stop(0)
12+
ElixirLS.LanguageServer.restart()
1313
end)
1414

1515
{:ok, %{}}

apps/language_server/lib/language_server/server.ex

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ defmodule ElixirLS.LanguageServer.Server do
6363
awaiting_contracts: [],
6464
supports_dynamic: false,
6565
mix_project?: false,
66+
mix_env: nil,
67+
mix_target: nil,
6668
no_mixfile_warned?: false
6769
]
6870

@@ -1147,7 +1149,7 @@ defmodule ElixirLS.LanguageServer.Server do
11471149
Dialyzer.check_support() == :ok && Map.get(settings, "dialyzerEnabled", true)
11481150

11491151
env_vars = Map.get(settings, "envVariables")
1150-
mix_env = Map.get(settings, "mixEnv", "test")
1152+
mix_env = Map.get(settings, "mixEnv")
11511153
mix_target = Map.get(settings, "mixTarget")
11521154
project_dir = Map.get(settings, "projectDir")
11531155
additional_watched_extensions = Map.get(settings, "additionalWatchedExtensions", [])
@@ -1217,11 +1219,11 @@ defmodule ElixirLS.LanguageServer.Server do
12171219
else
12181220
JsonRpc.show_message(
12191221
:warning,
1220-
"Environment variables have changed. ElixirLS needs to restart"
1222+
"Environment variables change detected. ElixirLS will restart"
12211223
)
1222-
1224+
# sleep so the client has time to show the message
12231225
Process.sleep(5000)
1224-
System.stop(1)
1226+
ElixirLS.LanguageServer.restart()
12251227
end
12261228

12271229
state
@@ -1234,19 +1236,20 @@ defmodule ElixirLS.LanguageServer.Server do
12341236
end
12351237

12361238
defp set_mix_env(state = %__MODULE__{}, env) do
1237-
prev_env = state.settings["mixEnv"]
1239+
prev_env = state.mix_env
12381240

12391241
if is_nil(prev_env) or env == prev_env do
12401242
System.put_env("MIX_ENV", env)
12411243
Mix.env(String.to_atom(env))
1244+
%{state | mix_env: env}
12421245
else
12431246
JsonRpc.show_message(:warning, "Mix env change detected. ElixirLS will restart.")
12441247

1248+
# sleep so the client has time to show the message
12451249
Process.sleep(5000)
1246-
System.stop(0)
1250+
ElixirLS.LanguageServer.restart()
1251+
state
12471252
end
1248-
1249-
state
12501253
end
12511254

12521255
defp set_mix_target(state = %__MODULE__{}, target) when target in [nil, ""] do
@@ -1255,19 +1258,20 @@ defmodule ElixirLS.LanguageServer.Server do
12551258
end
12561259

12571260
defp set_mix_target(state = %__MODULE__{}, target) do
1258-
prev_target = state.settings["mixTarget"]
1261+
prev_target = state.mix_target
12591262

12601263
if is_nil(prev_target) or target == prev_target do
12611264
System.put_env("MIX_TARGET", target)
12621265
Mix.target(String.to_atom(target))
1266+
%{state | mix_target: target}
12631267
else
12641268
JsonRpc.show_message(:warning, "Mix target change detected. ElixirLS will restart")
12651269

1270+
# sleep so the client has time to show the message
12661271
Process.sleep(5000)
1267-
System.stop(0)
1272+
ElixirLS.LanguageServer.restart()
1273+
state
12681274
end
1269-
1270-
state
12711275
end
12721276

12731277
defp set_project_dir(
@@ -1299,8 +1303,9 @@ defmodule ElixirLS.LanguageServer.Server do
12991303
"Project directory change detected. ElixirLS will restart"
13001304
)
13011305

1306+
# sleep so the client has time to show the message
13021307
Process.sleep(5000)
1303-
System.stop(0)
1308+
ElixirLS.LanguageServer.restart()
13041309

13051310
true ->
13061311
state

0 commit comments

Comments
 (0)