@@ -62,6 +62,8 @@ mutable struct LanguageServerInstance
6262 clientCapabilities:: Union{ClientCapabilities,Missing}
6363 clientInfo:: Union{InfoParams,Missing}
6464
65+ shutdown_requested:: Bool
66+
6567 function LanguageServerInstance (pipe_in, pipe_out, env_path= " " , depot_path= " " , err_handler= nothing , symserver_store_path= nothing )
6668 new (
6769 JSONRPC. JSONRPCEndpoint (pipe_in, pipe_out, err_handler),
@@ -87,7 +89,8 @@ mutable struct LanguageServerInstance
8789 false ,
8890 false ,
8991 missing ,
90- missing
92+ missing ,
93+ false
9194 )
9295 end
9396end
@@ -174,16 +177,16 @@ function trigger_symbolstore_reload(server::LanguageServerInstance)
174177 server. symbol_server,
175178 server. env_path,
176179 function (i)
177- if server. clientcapability_window_workdoneprogress && server. current_symserver_progress_token != = nothing
178- JSONRPC. send (
180+ if server. clientcapability_window_workdoneprogress && server. current_symserver_progress_token != = nothing
181+ JSONRPC. send (
179182 server. jr_endpoint,
180183 progress_notification_type,
181184 ProgressParams (server. current_symserver_progress_token, WorkDoneProgressReport (missing , " Indexing $i ..." , missing ))
182185 )
183- else
184- @info " Indexing $i ..."
185- end
186- end ,
186+ else
187+ @info " Indexing $i ..."
188+ end
189+ end ,
187190 server. err_handler
188191 )
189192
@@ -228,6 +231,21 @@ function trigger_symbolstore_reload(server::LanguageServerInstance)
228231 end
229232end
230233
234+ function request_wrapper (func, server:: LanguageServerInstance )
235+ return function (conn, params)
236+ if server. shutdown_requested
237+ # it's fine to always return a value here, even for notifications, because
238+ # JSONRPC discards it anyways in that case
239+ return JSONRPC. JSONRPCError (
240+ - 32600 ,
241+ " LS shutdown was requested." ,
242+ nothing
243+ )
244+ end
245+ func (params, server, conn)
246+ end
247+ end
248+
231249"""
232250 run(server::LanguageServerInstance)
233251
@@ -252,6 +270,9 @@ function Base.run(server::LanguageServerInstance)
252270 else
253271 Base. display_error (stderr , err, bt)
254272 end
273+ finally
274+ put! (server. combined_msg_queue, (type = :close ,))
275+ close (server. combined_msg_queue)
255276 end
256277
257278 @async try
@@ -266,47 +287,53 @@ function Base.run(server::LanguageServerInstance)
266287 else
267288 Base. display_error (stderr , err, bt)
268289 end
290+ finally
291+ put! (server. combined_msg_queue, (type = :close ,))
292+ close (server. combined_msg_queue)
269293 end
270294
271295 msg_dispatcher = JSONRPC. MsgDispatcher ()
272- msg_dispatcher[textDocument_codeAction_request_type] = (conn, params) -> textDocument_codeAction_request (params , server, conn )
273- msg_dispatcher[workspace_executeCommand_request_type] = (conn, params) -> workspace_executeCommand_request (params , server, conn )
274- msg_dispatcher[textDocument_completion_request_type] = (conn, params) -> textDocument_completion_request (params , server, conn )
275- msg_dispatcher[textDocument_signatureHelp_request_type] = (conn, params) -> textDocument_signatureHelp_request (params , server, conn )
276- msg_dispatcher[textDocument_definition_request_type] = (conn, params) -> textDocument_definition_request (params , server, conn )
277- msg_dispatcher[textDocument_formatting_request_type] = (conn, params) -> textDocument_formatting_request (params , server, conn )
278- msg_dispatcher[textDocument_references_request_type] = (conn, params) -> textDocument_references_request (params , server, conn )
279- msg_dispatcher[textDocument_rename_request_type] = (conn, params) -> textDocument_rename_request (params , server, conn )
280- msg_dispatcher[textDocument_documentSymbol_request_type] = (conn, params) -> textDocument_documentSymbol_request (params , server, conn )
281- msg_dispatcher[julia_getModuleAt_request_type] = (conn, params) -> julia_getModuleAt_request (params , server, conn )
282- msg_dispatcher[julia_getDocAt_request_type] = (conn, params) -> julia_getDocAt_request (params , server, conn )
283- msg_dispatcher[textDocument_hover_request_type] = (conn, params) -> textDocument_hover_request (params , server, conn )
284- msg_dispatcher[initialize_request_type] = (conn, params) -> initialize_request (params , server, conn )
285- msg_dispatcher[initialized_notification_type] = (conn, params) -> initialized_notification (params , server, conn )
286- msg_dispatcher[shutdown_request_type] = (conn, params) -> shutdown_request (params , server, conn )
287- msg_dispatcher[exit_notification_type] = (conn, params) -> exit_notification (params , server, conn )
288- msg_dispatcher[cancel_notification_type] = (conn, params) -> cancel_notification (params , server, conn )
289- msg_dispatcher[setTrace_notification_type] = (conn, params) -> setTrace_notification (params , server, conn )
290- msg_dispatcher[setTraceNotification_notification_type] = (conn, params) -> setTraceNotification_notification (params , server, conn) # Can we drop this?
291- msg_dispatcher[julia_getCurrentBlockRange_request_type] = (conn, params) -> julia_getCurrentBlockRange_request (params , server, conn )
292- msg_dispatcher[julia_activateenvironment_notification_type] = (conn, params) -> julia_activateenvironment_notification (params , server, conn )
293- msg_dispatcher[textDocument_didOpen_notification_type] = (conn, params) -> textDocument_didOpen_notification (params , server, conn )
294- msg_dispatcher[textDocument_didClose_notification_type] = (conn, params) -> textDocument_didClose_notification (params , server, conn )
295- msg_dispatcher[textDocument_didSave_notification_type] = (conn, params) -> textDocument_didSave_notification (params , server, conn )
296- msg_dispatcher[textDocument_willSave_notification_type] = (conn, params) -> textDocument_willSave_notification (params , server, conn )
297- msg_dispatcher[textDocument_willSaveWaitUntil_request_type] = (conn, params) -> textDocument_willSaveWaitUntil_request (params , server, conn )
298- msg_dispatcher[textDocument_didChange_notification_type] = (conn, params) -> textDocument_didChange_notification (params , server, conn )
299- msg_dispatcher[workspace_didChangeWatchedFiles_notification_type] = (conn, params) -> workspace_didChangeWatchedFiles_notification (params , server, conn )
300- msg_dispatcher[workspace_didChangeConfiguration_notification_type] = (conn, params) -> workspace_didChangeConfiguration_notification (params , server, conn )
301- msg_dispatcher[workspace_didChangeWorkspaceFolders_notification_type] = (conn, params) -> workspace_didChangeWorkspaceFolders_notification (params , server, conn )
302- msg_dispatcher[workspace_symbol_request_type] = (conn, params) -> workspace_symbol_request (params , server, conn )
303- msg_dispatcher[julia_refreshLanguageServer_notification_type] = (conn, params) -> julia_refreshLanguageServer_notification (params , server, conn )
304- msg_dispatcher[julia_getDocFromWord_request_type] = (conn, params) -> julia_getDocFromWord_request (params , server, conn )
296+ msg_dispatcher[textDocument_codeAction_request_type] = request_wrapper ( textDocument_codeAction_request, server)
297+ msg_dispatcher[workspace_executeCommand_request_type] = request_wrapper ( workspace_executeCommand_request, server)
298+ msg_dispatcher[textDocument_completion_request_type] = request_wrapper ( textDocument_completion_request, server)
299+ msg_dispatcher[textDocument_signatureHelp_request_type] = request_wrapper ( textDocument_signatureHelp_request, server)
300+ msg_dispatcher[textDocument_definition_request_type] = request_wrapper ( textDocument_definition_request, server)
301+ msg_dispatcher[textDocument_formatting_request_type] = request_wrapper ( textDocument_formatting_request, server)
302+ msg_dispatcher[textDocument_references_request_type] = request_wrapper ( textDocument_references_request, server)
303+ msg_dispatcher[textDocument_rename_request_type] = request_wrapper ( textDocument_rename_request, server)
304+ msg_dispatcher[textDocument_documentSymbol_request_type] = request_wrapper ( textDocument_documentSymbol_request, server)
305+ msg_dispatcher[julia_getModuleAt_request_type] = request_wrapper ( julia_getModuleAt_request, server)
306+ msg_dispatcher[julia_getDocAt_request_type] = request_wrapper ( julia_getDocAt_request, server)
307+ msg_dispatcher[textDocument_hover_request_type] = request_wrapper ( textDocument_hover_request, server)
308+ msg_dispatcher[initialize_request_type] = request_wrapper ( initialize_request, server)
309+ msg_dispatcher[initialized_notification_type] = request_wrapper ( initialized_notification, server)
310+ msg_dispatcher[shutdown_request_type] = request_wrapper ( shutdown_request, server)
311+ msg_dispatcher[exit_notification_type] = request_wrapper ( exit_notification, server)
312+ msg_dispatcher[cancel_notification_type] = request_wrapper ( cancel_notification, server)
313+ msg_dispatcher[setTrace_notification_type] = request_wrapper ( setTrace_notification, server)
314+ msg_dispatcher[setTraceNotification_notification_type] = request_wrapper ( setTraceNotification_notification, server)
315+ msg_dispatcher[julia_getCurrentBlockRange_request_type] = request_wrapper ( julia_getCurrentBlockRange_request, server)
316+ msg_dispatcher[julia_activateenvironment_notification_type] = request_wrapper ( julia_activateenvironment_notification, server)
317+ msg_dispatcher[textDocument_didOpen_notification_type] = request_wrapper ( textDocument_didOpen_notification, server)
318+ msg_dispatcher[textDocument_didClose_notification_type] = request_wrapper ( textDocument_didClose_notification, server)
319+ msg_dispatcher[textDocument_didSave_notification_type] = request_wrapper ( textDocument_didSave_notification, server)
320+ msg_dispatcher[textDocument_willSave_notification_type] = request_wrapper ( textDocument_willSave_notification, server)
321+ msg_dispatcher[textDocument_willSaveWaitUntil_request_type] = request_wrapper ( textDocument_willSaveWaitUntil_request, server)
322+ msg_dispatcher[textDocument_didChange_notification_type] = request_wrapper ( textDocument_didChange_notification, server)
323+ msg_dispatcher[workspace_didChangeWatchedFiles_notification_type] = request_wrapper ( workspace_didChangeWatchedFiles_notification, server)
324+ msg_dispatcher[workspace_didChangeConfiguration_notification_type] = request_wrapper ( workspace_didChangeConfiguration_notification, server)
325+ msg_dispatcher[workspace_didChangeWorkspaceFolders_notification_type] = request_wrapper ( workspace_didChangeWorkspaceFolders_notification, server)
326+ msg_dispatcher[workspace_symbol_request_type] = request_wrapper ( workspace_symbol_request, server)
327+ msg_dispatcher[julia_refreshLanguageServer_notification_type] = request_wrapper ( julia_refreshLanguageServer_notification, server)
328+ msg_dispatcher[julia_getDocFromWord_request_type] = request_wrapper ( julia_getDocFromWord_request, server)
305329
306330 while true
307331 message = take! (server. combined_msg_queue)
308332
309- if message. type == :clientmsg
333+ if message. type == :close
334+ @info " Shutting down server instance."
335+ return
336+ elseif message. type == :clientmsg
310337 msg = message. msg
311338
312339 JSONRPC. dispatch_msg (server. jr_endpoint, msg_dispatcher, msg)
0 commit comments