Skip to content

Commit 3b2c51b

Browse files
Fix invalid value set in write_manifest_pid (#430)
* properly set pid to write_manifest_pid previously it was {:ok, pid} | nil, now correctly pid | nil * reduce test flakyness * unlink process before killing * Apply suggestions from code review Co-authored-by: Jason Axelson <axelson@users.noreply.github.com>
1 parent 4037b91 commit 3b2c51b

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

apps/language_server/lib/language_server/dialyzer.ex

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,11 @@ defmodule ElixirLS.LanguageServer.Dialyzer do
125125
if not is_nil(state.build_ref) do
126126
do_analyze(state)
127127
else
128-
if state.write_manifest_pid, do: Process.exit(state.write_manifest_pid, :kill)
129-
pid = Manifest.write(state.root_path, active_plt, mod_deps, md5, warnings, timestamp)
128+
maybe_cancel_write_manifest(state)
129+
130+
{:ok, pid} =
131+
Manifest.write(state.root_path, active_plt, mod_deps, md5, warnings, timestamp)
132+
130133
%{state | write_manifest_pid: pid}
131134
end
132135

@@ -187,9 +190,9 @@ defmodule ElixirLS.LanguageServer.Dialyzer do
187190

188191
## Helpers
189192

190-
defp do_analyze(%{write_manifest_pid: write_manifest_pid} = state) do
193+
defp do_analyze(state) do
191194
# Cancel writing to the manifest, since we'll end up overwriting it anyway
192-
if is_pid(write_manifest_pid), do: Process.exit(write_manifest_pid, :cancelled)
195+
maybe_cancel_write_manifest(state)
193196

194197
parent = self()
195198
analysis_pid = spawn_link(fn -> compile(parent, state) end)
@@ -534,4 +537,11 @@ defmodule ElixirLS.LanguageServer.Dialyzer do
534537
seconds = :calendar.datetime_to_gregorian_seconds(:calendar.universal_time())
535538
:calendar.gregorian_seconds_to_datetime(seconds - 1)
536539
end
540+
541+
defp maybe_cancel_write_manifest(%{write_manifest_pid: nil}), do: :ok
542+
543+
defp maybe_cancel_write_manifest(%{write_manifest_pid: pid}) do
544+
Process.unlink(pid)
545+
Process.exit(pid, :kill)
546+
end
537547
end

apps/language_server/lib/language_server/dialyzer/manifest.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ defmodule ElixirLS.LanguageServer.Dialyzer.Manifest do
1919
end
2020

2121
def write(_, _, _, _, _, nil) do
22-
nil
22+
{:ok, nil}
2323
end
2424

2525
def write(root_path, active_plt, mod_deps, md5, warnings, timestamp) do

apps/language_server/test/dialyzer_test.exs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ defmodule ElixirLS.LanguageServer.DialyzerTest do
7373

7474
b_uri = SourceFile.path_to_uri("lib/b.ex")
7575
Server.receive_packet(server, did_open(b_uri, "elixir", 1, b_text))
76+
Process.sleep(1500)
7677
File.write!("lib/b.ex", b_text)
7778

7879
Server.receive_packet(server, did_save(b_uri))
@@ -81,7 +82,8 @@ defmodule ElixirLS.LanguageServer.DialyzerTest do
8182

8283
assert_receive notification("window/logMessage", %{
8384
"message" => "[ElixirLS Dialyzer] Analyzing 2 modules: [A, B]"
84-
})
85+
}),
86+
40000
8587

8688
# Stop while we're still capturing logs to avoid log leakage
8789
GenServer.stop(server)

0 commit comments

Comments
 (0)