Skip to content

Commit 0a2f8fe

Browse files
authored
fix: cancel previous compile requests (#242)
Cancels previous compile requests when a new one comes in.
1 parent 17c41db commit 0a2f8fe

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

lib/next_ls/runtime.ex

+11-8
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ defmodule NextLS.Runtime do
164164
%{
165165
name: name,
166166
working_dir: working_dir,
167-
compiler_ref: nil,
167+
compiler_refs: %{},
168168
port: port,
169169
task_supervisor: task_supervisor,
170170
logger: logger,
@@ -198,6 +198,8 @@ defmodule NextLS.Runtime do
198198
end
199199

200200
def handle_call({:compile, opts}, from, %{node: node} = state) do
201+
for {_ref, {task_pid, _from}} <- state.compiler_refs, do: Process.exit(task_pid, :kill)
202+
201203
task =
202204
Task.Supervisor.async_nolink(state.task_supervisor, fn ->
203205
if opts[:force] do
@@ -224,21 +226,22 @@ defmodule NextLS.Runtime do
224226
end
225227
end)
226228

227-
{:noreply, %{state | compiler_ref: %{task.ref => from}}}
229+
{:noreply, %{state | compiler_refs: Map.put(state.compiler_refs, task.ref, {task.pid, from})}}
228230
end
229231

230232
@impl GenServer
231-
def handle_info({ref, errors}, %{compiler_ref: compiler_ref} = state) when is_map_key(compiler_ref, ref) do
233+
def handle_info({ref, errors}, %{compiler_refs: compiler_refs} = state) when is_map_key(compiler_refs, ref) do
232234
Process.demonitor(ref, [:flush])
233235

234-
GenServer.reply(compiler_ref[ref], errors)
236+
orig = elem(compiler_refs[ref], 1)
237+
GenServer.reply(orig, errors)
235238

236-
{:noreply, %{state | compiler_ref: nil}}
239+
{:noreply, %{state | compiler_refs: Map.delete(compiler_refs, ref)}}
237240
end
238241

239-
def handle_info({:DOWN, ref, :process, _pid, _reason}, %{compiler_ref: compiler_ref} = state)
240-
when is_map_key(compiler_ref, ref) do
241-
{:noreply, %{state | compiler_ref: nil}}
242+
def handle_info({:DOWN, ref, :process, _pid, _reason}, %{compiler_refs: compiler_refs} = state)
243+
when is_map_key(compiler_refs, ref) do
244+
{:noreply, %{state | compiler_refs: Map.delete(compiler_refs, ref)}}
242245
end
243246

244247
def handle_info({:DOWN, _, :port, port, _}, %{port: port} = state) do

0 commit comments

Comments
 (0)