Skip to content

Commit 2fd52cc

Browse files
committed
fix parser crash when file is closed and debounce timeout has already put a message to process queue
1 parent 06178f5 commit 2fd52cc

File tree

1 file changed

+20
-14
lines changed
  • apps/language_server/lib/language_server

1 file changed

+20
-14
lines changed

apps/language_server/lib/language_server/parser.ex

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -212,23 +212,29 @@ defmodule ElixirLS.LanguageServer.Parser do
212212
{:parse_file, uri},
213213
%{files: files, debounce_refs: debounce_refs} = state
214214
) do
215-
file = Map.fetch!(files, uri)
216-
version = file.source_file.version
215+
state =
216+
case files[uri] do
217+
nil ->
218+
# file got closed, no need to do anything
219+
state
220+
file ->
221+
version = file.source_file.version
217222

218-
parent = self()
223+
parent = self()
219224

220-
{pid, ref} =
221-
spawn_monitor(fn ->
222-
updated_file = do_parse(file)
223-
send(parent, {:parse_file_done, uri, updated_file, nil})
224-
end)
225+
{pid, ref} =
226+
spawn_monitor(fn ->
227+
updated_file = do_parse(file)
228+
send(parent, {:parse_file_done, uri, updated_file, nil})
229+
end)
225230

226-
state = %{
227-
state
228-
| debounce_refs: Map.delete(debounce_refs, uri),
229-
parse_pids: put_nested(state.parse_pids, {uri, version}, ref, {pid, nil}),
230-
parse_uris: Map.put(state.parse_uris, ref, {uri, version})
231-
}
231+
%{
232+
state
233+
| debounce_refs: Map.delete(debounce_refs, uri),
234+
parse_pids: put_nested(state.parse_pids, {uri, version}, ref, {pid, nil}),
235+
parse_uris: Map.put(state.parse_uris, ref, {uri, version})
236+
}
237+
end
232238

233239
{:noreply, state}
234240
end

0 commit comments

Comments
 (0)