@@ -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