Skip to content

Commit 6a52eb9

Browse files
committed
write tracer manifast on succesful compile
rebuild if manifest version does not match
1 parent b6acb47 commit 6a52eb9

File tree

4 files changed

+81
-17
lines changed

4 files changed

+81
-17
lines changed

apps/language_server/lib/language_server/build.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ defmodule ElixirLS.LanguageServer.Build do
5858
:global.trans({__MODULE__, self()}, func)
5959
end
6060

61-
defp reload_project do
61+
def reload_project do
6262
mixfile = Path.absname(MixfileHelpers.mix_exs())
6363

6464
if File.exists?(mixfile) do

apps/language_server/lib/language_server/server.ex

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ defmodule ElixirLS.LanguageServer.Server do
529529
"file://" <> _ ->
530530
root_path = SourceFile.Path.absolute_from_uri(root_uri)
531531
File.cd!(root_path)
532+
Logger.info("cd initialize")
532533
cwd_uri = SourceFile.Path.to_uri(File.cwd!())
533534
%{state | root_uri: cwd_uri}
534535

@@ -1241,6 +1242,7 @@ defmodule ElixirLS.LanguageServer.Server do
12411242

12421243
is_nil(prev_project_dir) ->
12431244
File.cd!(project_dir)
1245+
Logger.info("cd set_project_dir")
12441246
%{state | project_dir: File.cwd!(), mix_project?: File.exists?(MixfileHelpers.mix_exs())}
12451247

12461248
prev_project_dir != project_dir ->
@@ -1300,11 +1302,21 @@ defmodule ElixirLS.LanguageServer.Server do
13001302
end)
13011303
end
13021304

1303-
defp maybe_rebuild(state = %__MODULE__{}) do
1305+
defp maybe_rebuild(state = %__MODULE__{project_dir: project_dir}) do
13041306
# detect if we are opening a project that has been compiled without a tracer
1305-
if is_binary(state.project_dir) and state.mix_project and File.dir?(Path.join([project_dir, ".elixir_ls"])) and not Tracer.has_databases?(project_dir) do
1306-
Logger.info("DETS databases rebuild will be rebuilt")
1307-
Build.clean(true)
1307+
if is_binary(project_dir) and state.mix_project? and
1308+
File.dir?(Path.join([project_dir, ".elixir_ls"])) and
1309+
not Tracer.manifest_version_current?(project_dir) do
1310+
Logger.info("DETS databases will be rebuilt")
1311+
Tracer.clean_dets(project_dir)
1312+
1313+
case Build.reload_project() do
1314+
{:ok, _} ->
1315+
Build.clean(true)
1316+
1317+
_ ->
1318+
:ok
1319+
end
13081320
end
13091321
end
13101322
end

apps/language_server/lib/language_server/tracer.ex

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ defmodule ElixirLS.LanguageServer.Tracer do
44
use GenServer
55
require Logger
66

7+
@version 1
8+
79
@tables ~w(modules calls)a
810

911
for table <- @tables do
@@ -20,6 +22,10 @@ defmodule ElixirLS.LanguageServer.Tracer do
2022
GenServer.call(__MODULE__, {:set_project_dir, project_dir})
2123
end
2224

25+
def save() do
26+
GenServer.cast(__MODULE__, :save)
27+
end
28+
2329
defp get_project_dir() do
2430
case Process.get(:elixir_ls_project_dir) do
2531
nil ->
@@ -80,6 +86,19 @@ defmodule ElixirLS.LanguageServer.Tracer do
8086
{:reply, project_dir, state}
8187
end
8288

89+
@impl true
90+
def handle_cast(:save, %{project_dir: project_dir} = state) do
91+
for table <- @tables do
92+
table_name = table_name(table)
93+
94+
sync(table_name)
95+
end
96+
97+
write_manifest(project_dir)
98+
99+
{:noreply, state}
100+
end
101+
83102
@impl true
84103
def terminate(_reason, state) do
85104
maybe_close_tables(state)
@@ -95,10 +114,6 @@ defmodule ElixirLS.LanguageServer.Tracer do
95114
:ok
96115
end
97116

98-
def has_databases?(project_dir) do
99-
File.exists?(dets_path(project_dir, hd(@tables)))
100-
end
101-
102117
defp dets_path(project_dir, table) do
103118
Path.join([project_dir, ".elixir_ls", "#{table}.dets"])
104119
end
@@ -270,14 +285,6 @@ defmodule ElixirLS.LanguageServer.Tracer do
270285
end)
271286
end
272287

273-
def save do
274-
for table <- @tables do
275-
table_name = table_name(table)
276-
277-
sync(table_name)
278-
end
279-
end
280-
281288
defp sync(table_name) do
282289
with :ok <- :dets.from_ets(table_name, table_name),
283290
:ok <- :dets.sync(table_name) do
@@ -336,4 +343,34 @@ defmodule ElixirLS.LanguageServer.Tracer do
336343
end
337344
end
338345
end
346+
347+
defp manifest_path(project_dir) do
348+
Path.join([project_dir, ".elixir_ls", "tracer_db.manifest"])
349+
end
350+
351+
def write_manifest(project_dir) do
352+
path = manifest_path(project_dir)
353+
File.rm_rf!(path)
354+
File.write!(path, "#{@version}")
355+
end
356+
357+
def read_manifest(project_dir) do
358+
with {:ok, text} <- File.read(manifest_path(project_dir)),
359+
{version, ""} <- Integer.parse(text) do
360+
version
361+
else
362+
_ -> nil
363+
end
364+
end
365+
366+
def manifest_version_current?(project_dir) do
367+
read_manifest(project_dir) == @version
368+
end
369+
370+
def clean_dets(project_dir) do
371+
for path <-
372+
Path.join([project_dir, ".elixir_ls/*.dets"])
373+
|> Path.wildcard(),
374+
do: File.rm_rf!(path)
375+
end
339376
end

apps/language_server/test/tracer_test.exs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ defmodule ElixirLS.LanguageServer.TracerTest do
44
alias ElixirLS.LanguageServer.Test.FixtureHelpers
55

66
setup context do
7+
File.rm_rf!(FixtureHelpers.get_path(".elixir_ls/tracer_db.manifest"))
78
File.rm_rf!(FixtureHelpers.get_path(".elixir_ls/calls.dets"))
89
File.rm_rf!(FixtureHelpers.get_path(".elixir_ls/modules.dets"))
910
{:ok, _pid} = start_supervised(Tracer)
@@ -206,4 +207,18 @@ defmodule ElixirLS.LanguageServer.TracerTest do
206207
assert [] == sorted_calls()
207208
end
208209
end
210+
211+
describe "manifest" do
212+
test "return nil when not found" do
213+
project_path = FixtureHelpers.get_path("")
214+
assert nil == Tracer.read_manifest(project_path)
215+
end
216+
217+
test "reads manifest" do
218+
project_path = FixtureHelpers.get_path("")
219+
Tracer.write_manifest(project_path)
220+
221+
assert 1 == Tracer.read_manifest(project_path)
222+
end
223+
end
209224
end

0 commit comments

Comments
 (0)