@@ -3,7 +3,16 @@ defmodule ElixirLS.LanguageServer.Build do
3
3
alias ElixirLS.Utils.MixfileHelpers
4
4
require Logger
5
5
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
+
6
13
def build ( parent , root_path , opts ) when is_binary ( root_path ) do
14
+ Application . loaded_applications ( ) |> Enum . map ( & elem ( & 1 , 0 ) ) |> dbg
15
+
7
16
build_pid_reference =
8
17
spawn_monitor ( fn ->
9
18
with_build_lock ( fn ->
@@ -180,6 +189,8 @@ defmodule ElixirLS.LanguageServer.Build do
180
189
end
181
190
182
191
defp reload_project ( mixfile , root_path ) do
192
+ store_required_apps ( )
193
+
183
194
if File . exists? ( mixfile ) do
184
195
if module = Mix.Project . get ( ) do
185
196
if module != ElixirLS.LanguageServer.MixProject do
@@ -235,6 +246,8 @@ defmodule ElixirLS.LanguageServer.Build do
235
246
Mix.Project . clear_deps_cache ( )
236
247
Mix.State . clear_cache ( )
237
248
249
+ reset_apps_config ( )
250
+
238
251
Mix.Task . clear ( )
239
252
240
253
if Version . match? ( System . version ( ) , ">= 1.15.0-dev" ) do
@@ -472,8 +485,6 @@ defmodule ElixirLS.LanguageServer.Build do
472
485
end
473
486
474
487
defp purge_app ( app , purge_modules? \\ true ) do
475
- Logger . debug ( "Stopping #{ app } " )
476
-
477
488
case Application . stop ( app ) do
478
489
:ok -> :ok
479
490
{ :error , { :not_started , _ } } -> :ok
@@ -488,13 +499,10 @@ defmodule ElixirLS.LanguageServer.Build do
488
499
end
489
500
490
501
if modules != [ ] do
491
- Logger . debug ( "Purging #{ length ( modules ) } modules from #{ app } " )
492
502
for module <- modules , do: purge_module ( module )
493
503
end
494
504
end
495
505
496
- Logger . debug ( "Unloading #{ app } " )
497
-
498
506
case Application . unload ( app ) do
499
507
:ok -> :ok
500
508
{ :error , { :not_loaded , _ } } -> :ok
@@ -520,6 +528,8 @@ defmodule ElixirLS.LanguageServer.Build do
520
528
defp maybe_purge_dep ( % Mix.Dep { status: status , deps: deps } = dep ) do
521
529
for dep <- deps , do: maybe_purge_dep ( dep )
522
530
531
+ dbg ( { dep . app , status } )
532
+
523
533
purge? =
524
534
case status do
525
535
{ :nomatchvsn , _ } -> true
@@ -534,16 +544,7 @@ defmodule ElixirLS.LanguageServer.Build do
534
544
end
535
545
536
546
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
547
548
raise "Unloading required #{ app } "
548
549
end
549
550
@@ -610,6 +611,17 @@ defmodule ElixirLS.LanguageServer.Build do
610
611
end
611
612
end
612
613
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
+
613
625
defp fetch_deps ( current_deps ) do
614
626
missing_deps =
615
627
current_deps
0 commit comments