From c25e22d3c25936d59f9495309cf5a4539e17cf53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Samson?= Date: Wed, 27 Sep 2023 19:02:23 +0200 Subject: [PATCH] Vendor erlex, erl2ex, unload not needed apps (#989) * update dialyxir to 1.4.1 vendor erlex * vendor erl2ex lock path_glob * unload and remove not wanted apps from code path * remove unloaded apps from code path --- apps/elixir_ls_debugger/lib/debugger/cli.ex | 16 +++++++++-- apps/elixir_ls_utils/lib/launch.ex | 22 +++++++++++++++ .../test/support/mix_test.case.ex | 4 +-- .../lib/language_server/build.ex | 28 +++++++++++++------ .../lib/language_server/cli.ex | 2 ++ .../type_spec/contract_translator.ex | 4 +-- .../lib/language_server/server.ex | 1 + apps/language_server/mix.exs | 4 +-- dep_versions.exs | 6 ++-- mix.lock | 9 +++--- 10 files changed, 73 insertions(+), 23 deletions(-) diff --git a/apps/elixir_ls_debugger/lib/debugger/cli.ex b/apps/elixir_ls_debugger/lib/debugger/cli.ex index de9ffb780..59c81899d 100644 --- a/apps/elixir_ls_debugger/lib/debugger/cli.ex +++ b/apps/elixir_ls_debugger/lib/debugger/cli.ex @@ -1,4 +1,5 @@ defmodule ElixirLS.Debugger.CLI do + alias ElixirLS.Utils alias ElixirLS.Utils.{WireProtocol, Launch} alias ElixirLS.Debugger.{Output, Server} @@ -32,15 +33,26 @@ defmodule ElixirLS.Debugger.CLI do Launch.limit_num_schedulers() warn_if_unsupported_version() + + Launch.unload_not_needed_apps([ + :nimble_parsec, + :mix_task_archive_deps, + :language_server, + :dialyxir_vendored, + :path_glob_vendored, + :erlex_vendored, + :erl2ex_vendored + ]) + WireProtocol.stream_packets(&Server.receive_packet/1) end defp warn_if_unsupported_version do - with {:error, message} <- ElixirLS.Utils.MinimumVersion.check_elixir_version() do + with {:error, message} <- Utils.MinimumVersion.check_elixir_version() do Output.debugger_important("WARNING: " <> message) end - with {:error, message} <- ElixirLS.Utils.MinimumVersion.check_otp_version() do + with {:error, message} <- Utils.MinimumVersion.check_otp_version() do Output.debugger_important("WARNING: " <> message) end end diff --git a/apps/elixir_ls_utils/lib/launch.ex b/apps/elixir_ls_utils/lib/launch.ex index ff97ab35b..85c67dbaf 100644 --- a/apps/elixir_ls_utils/lib/launch.ex +++ b/apps/elixir_ls_utils/lib/launch.ex @@ -231,4 +231,26 @@ defmodule ElixirLS.Utils.Launch do raise Mix.NoTaskError, task: task end end + + def unload_not_needed_apps(apps) do + for app <- apps do + modules = + case :application.get_key(app, :modules) do + {:ok, modules} -> modules + _ -> [] + end + + for module <- modules do + :code.purge(module) + :code.delete(module) + end + + lib_dir = :code.lib_dir(app) + Application.unload(app) + + if is_list(lib_dir) do + :code.del_path(:filename.join(lib_dir, ~c"ebin")) + end + end + end end diff --git a/apps/elixir_ls_utils/test/support/mix_test.case.ex b/apps/elixir_ls_utils/test/support/mix_test.case.ex index 335cd02b5..c1a8eae34 100644 --- a/apps/elixir_ls_utils/test/support/mix_test.case.ex +++ b/apps/elixir_ls_utils/test/support/mix_test.case.ex @@ -20,12 +20,12 @@ defmodule ElixirLS.Utils.MixTest.Case do statistex patch deep_merge - erlex + erlex_vendored benchee path_glob_vendored dialyzer dialyxir_vendored - erl2ex + erl2ex_vendored jason_v )a diff --git a/apps/language_server/lib/language_server/build.ex b/apps/language_server/lib/language_server/build.ex index 20aa9f92e..7b09205d5 100644 --- a/apps/language_server/lib/language_server/build.ex +++ b/apps/language_server/lib/language_server/build.ex @@ -297,7 +297,6 @@ defmodule ElixirLS.LanguageServer.Build do end defp purge_app(app) do - # TODO use hack with ets modules = case :application.get_key(app, :modules) do {:ok, modules} -> modules @@ -314,12 +313,27 @@ defmodule ElixirLS.LanguageServer.Build do case Application.stop(app) do :ok -> :ok {:error, :not_started} -> :ok - {:error, error} -> Logger.error("Application.stop failed for #{app}: #{inspect(error)}") + {:error, error} -> Logger.warning("Application.stop failed for #{app}: #{inspect(error)}") end + lib_dir = :code.lib_dir(app) + case Application.unload(app) do :ok -> :ok - {:error, error} -> Logger.error("Application.unload failed for #{app}: #{inspect(error)}") + {:error, error} -> Logger.warning("Application.unload failed for #{app}: #{inspect(error)}") + end + + if is_list(lib_dir) do + case :code.del_path(:filename.join(lib_dir, ~c"ebin")) do + true -> + :ok + + false -> + :ok + + {:error, reason} -> + Logger.warning("Unable to clean code path for #{app}: #{inspect(reason)}") + end end end @@ -359,15 +373,13 @@ defmodule ElixirLS.LanguageServer.Build do :language_server, :elixir_ls_utils, :elixir_sense, - :stream_data, :jason_v, :path_glob_vendored, :dialyxir_vendored, - :erl2ex, - :patch, - :benchee + :erlex_vendored, + :erl2ex_vendored ] do - raise "Unloading #{app}" + raise "Unloading required #{app}" end for path <- Mix.Dep.load_paths(dep) do diff --git a/apps/language_server/lib/language_server/cli.ex b/apps/language_server/lib/language_server/cli.ex index 6df4bb7d0..a8e2fe167 100644 --- a/apps/language_server/lib/language_server/cli.ex +++ b/apps/language_server/lib/language_server/cli.ex @@ -65,6 +65,8 @@ defmodule ElixirLS.LanguageServer.CLI do Mix.shell(ElixirLS.LanguageServer.MixShell) + Launch.unload_not_needed_apps([:nimble_parsec, :mix_task_archive_deps, :elixir_ls_debugger]) + WireProtocol.stream_packets(&JsonRpc.receive_packet/1) end diff --git a/apps/language_server/lib/language_server/providers/code_lens/type_spec/contract_translator.ex b/apps/language_server/lib/language_server/providers/code_lens/type_spec/contract_translator.ex index faf5c4273..f6338a743 100644 --- a/apps/language_server/lib/language_server/providers/code_lens/type_spec/contract_translator.ex +++ b/apps/language_server/lib/language_server/providers/code_lens/type_spec/contract_translator.ex @@ -1,7 +1,7 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.TypeSpec.ContractTranslator do @moduledoc false - alias Erl2ex.Convert.{Context, ErlForms} - alias Erl2ex.Pipeline.{Parse, ModuleData, ExSpec} + alias Erl2exVendored.Convert.{Context, ErlForms} + alias Erl2exVendored.Pipeline.{Parse, ModuleData, ExSpec} def translate_contract(fun, contract, is_macro, mod) do # FIXME: Private module diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index ae693aa21..a65bb57c4 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -285,6 +285,7 @@ defmodule ElixirLS.LanguageServer.Server do case source_files[uri] do %SourceFile{} = source_file -> file = SourceFile.Path.from_uri(uri) + case parse_file(source_file.text, file) do [] -> Map.delete(state.parser_diagnostics, uri) diff --git a/apps/language_server/mix.exs b/apps/language_server/mix.exs index ea128b233..44e0c3468 100644 --- a/apps/language_server/mix.exs +++ b/apps/language_server/mix.exs @@ -38,12 +38,12 @@ defmodule ElixirLS.LanguageServer.Mixfile do [ {:elixir_ls_utils, in_umbrella: true}, {:elixir_sense, github: "elixir-lsp/elixir_sense", ref: @dep_versions[:elixir_sense]}, - {:erl2ex, github: "dazuma/erl2ex"}, + {:erl2ex_vendored, github: "elixir-lsp/erl2ex", ref: @dep_versions[:erl2ex_vendored]}, {:dialyxir_vendored, github: "elixir-lsp/dialyxir", ref: @dep_versions[:dialyxir_vendored], runtime: false}, {:jason_v, github: "elixir-lsp/jason", ref: @dep_versions[:jason_v]}, {:stream_data, "~> 0.5", only: [:dev, :test], runtime: false}, - {:path_glob_vendored, github: "elixir-lsp/path_glob", branch: "vendored"}, + {:path_glob_vendored, github: "elixir-lsp/path_glob", ref: @dep_versions[:path_glob_vendored]}, {:patch, "~> 0.12.0", only: [:dev, :test], runtime: false}, {:benchee, "~> 1.0", only: :dev, runtime: false} ] diff --git a/dep_versions.exs b/dep_versions.exs index 690669147..05ff4d99f 100644 --- a/dep_versions.exs +++ b/dep_versions.exs @@ -1,5 +1,7 @@ [ elixir_sense: "6a9f011ce5148b84de0fa1b142e38ccdbc26340c", - dialyxir_vendored: "7e908b4d760c7329046e0ee3076be9156cd784e1", - jason_v: "c81537e2a5e1acacb915cf339fe400357e3c2aaa" + dialyxir_vendored: "d50dcd7101c6ebd37b57b7ee4a7888d8cb634782", + jason_v: "c81537e2a5e1acacb915cf339fe400357e3c2aaa", + erl2ex_vendored: "073ac6b9a44282e718b6050c7b27cedf9217a12a", + path_glob_vendored: "965350dc41def7be4a70a23904195c733a2ecc84" ] diff --git a/mix.lock b/mix.lock index ce62e218c..ca87390e7 100644 --- a/mix.lock +++ b/mix.lock @@ -1,16 +1,15 @@ %{ "benchee": {:hex, :benchee, "1.1.0", "f3a43817209a92a1fade36ef36b86e1052627fd8934a8b937ac9ab3a76c43062", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.0", [hex: :statistex, repo: "hexpm", optional: false]}], "hexpm", "7da57d545003165a012b587077f6ba90b89210fd88074ce3c60ce239eb5e6d93"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, - "dialyxir_vendored": {:git, "https://github.com/elixir-lsp/dialyxir.git", "7e908b4d760c7329046e0ee3076be9156cd784e1", [ref: "7e908b4d760c7329046e0ee3076be9156cd784e1"]}, + "dialyxir_vendored": {:git, "https://github.com/elixir-lsp/dialyxir.git", "d50dcd7101c6ebd37b57b7ee4a7888d8cb634782", [ref: "d50dcd7101c6ebd37b57b7ee4a7888d8cb634782"]}, "elixir_sense": {:git, "https://github.com/elixir-lsp/elixir_sense.git", "6a9f011ce5148b84de0fa1b142e38ccdbc26340c", [ref: "6a9f011ce5148b84de0fa1b142e38ccdbc26340c"]}, - "erl2ex": {:git, "https://github.com/dazuma/erl2ex.git", "244c2d9ed5805ef4855a491d8616b8842fef7ca4", []}, - "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, + "erl2ex_vendored": {:git, "https://github.com/elixir-lsp/erl2ex.git", "073ac6b9a44282e718b6050c7b27cedf9217a12a", [ref: "073ac6b9a44282e718b6050c7b27cedf9217a12a"]}, + "erlex_vendored": {:git, "https://github.com/elixir-lsp/erlex.git", "82db0e82ee4896491bc26dec99f5d795f03ab9f4", [ref: "82db0e82ee4896491bc26dec99f5d795f03ab9f4"]}, "jason_v": {:git, "https://github.com/elixir-lsp/jason.git", "c81537e2a5e1acacb915cf339fe400357e3c2aaa", [ref: "c81537e2a5e1acacb915cf339fe400357e3c2aaa"]}, - "jason_vendored": {:git, "https://github.com/elixir-lsp/jason.git", "e23c65b98411a3066ca73534b4aed1d23bcf0356", [branch: "vendored"]}, "mix_task_archive_deps": {:git, "https://github.com/elixir-lsp/mix_task_archive_deps.git", "30fa76221def649286835685fec5d151be83c354", []}, "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, "patch": {:hex, :patch, "0.12.0", "2da8967d382bade20344a3e89d618bfba563b12d4ac93955468e830777f816b0", [:mix], [], "hexpm", "ffd0e9a7f2ad5054f37af84067ee88b1ad337308a1cb227e181e3967127b0235"}, - "path_glob_vendored": {:git, "https://github.com/elixir-lsp/path_glob.git", "965350dc41def7be4a70a23904195c733a2ecc84", [branch: "vendored"]}, + "path_glob_vendored": {:git, "https://github.com/elixir-lsp/path_glob.git", "965350dc41def7be4a70a23904195c733a2ecc84", [ref: "965350dc41def7be4a70a23904195c733a2ecc84"]}, "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, "stream_data": {:hex, :stream_data, "0.5.0", "b27641e58941685c75b353577dc602c9d2c12292dd84babf506c2033cd97893e", [:mix], [], "hexpm", "012bd2eec069ada4db3411f9115ccafa38540a3c78c4c0349f151fc761b9e271"}, }