Skip to content

Commit 56fb766

Browse files
committed
Clear app config on build
Workaround elixir-lang/elixir#13246 Fixes #1030
1 parent 9e84fd7 commit 56fb766

File tree

1 file changed

+27
-15
lines changed
  • apps/language_server/lib/language_server

1 file changed

+27
-15
lines changed

apps/language_server/lib/language_server/build.ex

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,16 @@ defmodule ElixirLS.LanguageServer.Build do
33
alias ElixirLS.Utils.MixfileHelpers
44
require Logger
55

6+
defp store_required_apps() do
7+
unless :persistent_term.get(:language_server_required_apps, false) do
8+
apps = Application.loaded_applications() |> Enum.map(&elem(&1, 0))
9+
:persistent_term.put(:language_server_required_apps, apps)
10+
end
11+
end
12+
613
def build(parent, root_path, opts) when is_binary(root_path) do
14+
Application.loaded_applications() |> Enum.map(&elem(&1, 0)) |> dbg
15+
716
build_pid_reference =
817
spawn_monitor(fn ->
918
with_build_lock(fn ->
@@ -180,6 +189,8 @@ defmodule ElixirLS.LanguageServer.Build do
180189
end
181190

182191
defp reload_project(mixfile, root_path) do
192+
store_required_apps()
193+
183194
if File.exists?(mixfile) do
184195
if module = Mix.Project.get() do
185196
if module != ElixirLS.LanguageServer.MixProject do
@@ -235,6 +246,8 @@ defmodule ElixirLS.LanguageServer.Build do
235246
Mix.Project.clear_deps_cache()
236247
Mix.State.clear_cache()
237248

249+
reset_apps_config()
250+
238251
Mix.Task.clear()
239252

240253
if Version.match?(System.version(), ">= 1.15.0-dev") do
@@ -472,8 +485,6 @@ defmodule ElixirLS.LanguageServer.Build do
472485
end
473486

474487
defp purge_app(app, purge_modules? \\ true) do
475-
Logger.debug("Stopping #{app}")
476-
477488
case Application.stop(app) do
478489
:ok -> :ok
479490
{:error, {:not_started, _}} -> :ok
@@ -488,13 +499,10 @@ defmodule ElixirLS.LanguageServer.Build do
488499
end
489500

490501
if modules != [] do
491-
Logger.debug("Purging #{length(modules)} modules from #{app}")
492502
for module <- modules, do: purge_module(module)
493503
end
494504
end
495505

496-
Logger.debug("Unloading #{app}")
497-
498506
case Application.unload(app) do
499507
:ok -> :ok
500508
{:error, {:not_loaded, _}} -> :ok
@@ -520,6 +528,8 @@ defmodule ElixirLS.LanguageServer.Build do
520528
defp maybe_purge_dep(%Mix.Dep{status: status, deps: deps} = dep) do
521529
for dep <- deps, do: maybe_purge_dep(dep)
522530

531+
dbg({dep.app, status})
532+
523533
purge? =
524534
case status do
525535
{:nomatchvsn, _} -> true
@@ -534,16 +544,7 @@ defmodule ElixirLS.LanguageServer.Build do
534544
end
535545

536546
defp purge_dep(%Mix.Dep{app: app} = dep) do
537-
if app in [
538-
:language_server,
539-
:elixir_ls_utils,
540-
:elixir_sense,
541-
:jason_v,
542-
:path_glob_vendored,
543-
:dialyxir_vendored,
544-
:erlex_vendored,
545-
:erl2ex_vendored
546-
] do
547+
if app in :persistent_term.get(:language_server_required_apps) do
547548
raise "Unloading required #{app}"
548549
end
549550

@@ -610,6 +611,17 @@ defmodule ElixirLS.LanguageServer.Build do
610611
end
611612
end
612613

614+
defp reset_apps_config() do
615+
apps = Application.loaded_applications() |> Enum.map(&elem(&1, 0))
616+
617+
for app <- apps -- :persistent_term.get(:language_server_required_apps) do
618+
# workaround for https://github.com/elixir-lang/elixir/issues/13246
619+
for {key, _} <- :application.get_all_env(app) do
620+
:application.unset_env(app, key, persistent: true)
621+
end
622+
end
623+
end
624+
613625
defp fetch_deps(current_deps) do
614626
missing_deps =
615627
current_deps

0 commit comments

Comments
 (0)