Skip to content

Commit 359f52e

Browse files
committed
Reload Mix.State from env after loading client settings
Fixes elixir-lsp/vscode-elixir-ls#324
1 parent 9bf1f70 commit 359f52e

File tree

4 files changed

+37
-10
lines changed

4 files changed

+37
-10
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
### Unreleased
22

3+
#### Fixes
4+
5+
- Fixed regression in debugger not respecting `MIX_ENV` and `MIX_TARGET`
6+
37
### v0.14.4: 20 April 2023
48

59
#### Fixes

apps/elixir_ls_debugger/lib/debugger/server.ex

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ defmodule ElixirLS.Debugger.Server do
2727
}
2828

2929
alias ElixirLS.Debugger.Stacktrace.Frame
30+
alias ElixirLS.Utils.Launch
3031
use GenServer
3132
use Protocol
3233

@@ -937,9 +938,10 @@ defmodule ElixirLS.Debugger.Server do
937938
# the startup sequence here is taken from
938939
# https://github.com/elixir-lang/elixir/blob/v1.14.4/lib/mix/lib/mix/cli.ex#L158
939940
# we assume that mix is already started and has archives and tasks loaded
940-
ElixirLS.Utils.Launch.load_mix_exs()
941-
{task, task_args} = ElixirLS.Utils.Launch.get_task(List.wrap(task) ++ task_args)
942-
ElixirLS.Utils.Launch.maybe_change_env_and_target(task)
941+
Launch.reload_mix_env_and_target()
942+
Launch.load_mix_exs()
943+
{task, task_args} = Launch.get_task(List.wrap(task) ++ task_args)
944+
Launch.maybe_change_env_and_target(task)
943945

944946
Output.debugger_console("Running with MIX_ENV: #{Mix.env()} MIX_TARGET: #{Mix.target()}\n")
945947

apps/elixir_ls_utils/lib/launch.ex

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,20 @@ defmodule ElixirLS.Utils.Launch do
163163
The --help and --version options can be given instead of a task for usage and versioning information.
164164
""")
165165
end
166+
167+
defp from_env(varname, default) do
168+
case System.get_env(varname) do
169+
nil -> default
170+
"" -> default
171+
value -> String.to_atom(value)
172+
end
173+
end
174+
175+
# this code is executed on Mix.State.init
176+
# since we start mix earlier with language server/debugger
177+
# we need to reinitialize Mix.State when env is loaded form client settings
178+
def reload_mix_env_and_target() do
179+
Mix.env(from_env("MIX_ENV", :dev))
180+
Mix.target(from_env("MIX_TARGET", :host))
181+
end
166182
end

apps/language_server/lib/language_server/server.ex

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,7 +1146,7 @@ defmodule ElixirLS.LanguageServer.Server do
11461146
state
11471147
|> maybe_set_env_vars(env_vars)
11481148
|> set_mix_env(mix_env)
1149-
|> maybe_set_mix_target(mix_target)
1149+
|> set_mix_target(mix_target)
11501150
|> set_project_dir(project_dir)
11511151
|> set_dialyzer_enabled(enable_dialyzer)
11521152
|> add_watched_extensions(additional_watched_extensions)
@@ -1217,10 +1217,17 @@ defmodule ElixirLS.LanguageServer.Server do
12171217
state
12181218
end
12191219

1220+
defp set_mix_env(state = %__MODULE__{}, env) when env in [nil, ""] do
1221+
# mix defaults to :dev env but we choose :test as this results in better
1222+
# support for test files
1223+
set_mix_env(state, "test")
1224+
end
1225+
12201226
defp set_mix_env(state = %__MODULE__{}, env) do
12211227
prev_env = state.settings["mixEnv"]
12221228

12231229
if is_nil(prev_env) or env == prev_env do
1230+
System.put_env("MIX_ENV", env)
12241231
Mix.env(String.to_atom(env))
12251232
else
12261233
JsonRpc.show_message(:warning, "Mix env change detected. ElixirLS will restart.")
@@ -1232,18 +1239,16 @@ defmodule ElixirLS.LanguageServer.Server do
12321239
state
12331240
end
12341241

1235-
defp maybe_set_mix_target(state = %__MODULE__{}, nil), do: state
1236-
1237-
defp maybe_set_mix_target(state = %__MODULE__{}, ""), do: state
1238-
1239-
defp maybe_set_mix_target(state = %__MODULE__{}, target) do
1240-
set_mix_target(state, target)
1242+
defp set_mix_target(state = %__MODULE__{}, target) when target in [nil, ""] do
1243+
# mix defaults to :host target
1244+
set_mix_target(state, "host")
12411245
end
12421246

12431247
defp set_mix_target(state = %__MODULE__{}, target) do
12441248
prev_target = state.settings["mixTarget"]
12451249

12461250
if is_nil(prev_target) or target == prev_target do
1251+
System.put_env("MIX_TARGET", target)
12471252
Mix.target(String.to_atom(target))
12481253
else
12491254
JsonRpc.show_message(:warning, "Mix target change detected. ElixirLS will restart")

0 commit comments

Comments
 (0)