Skip to content

Commit

Permalink
LSP: Forcefully shutdown uninitialized servers (helix-editor#7449)
Browse files Browse the repository at this point in the history
The LSP spec has this to say about initialize:

> Until the server has responded to the `initialize` request with an
> `InitializeResult`, the client must not send any additional requests
> or notifications to the server.

(https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#initialize)

The spec is not really explicit about how to handle this scenario.
Before a client sends the 'initialize' request we are allowed to send an
'exit' notification, but after 'initialize' we can't send any requests
(like shutdown) or notifications (like exit). So my intepretation is
that we should forcefully close the server in this state.

This matches the behavior of Neovim's built-in LSP client:
https://github.com/neovim/neovim/blob/5ceb2238d3685255cd517ca87fd7edae9ed88811/runtime/lua/vim/lsp.lua#L1610-L1628
  • Loading branch information
the-mikedavis authored and wes-adams committed Jul 3, 2023
1 parent dee90b9 commit 008074d
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion helix-lsp/src/transport.rs
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ impl Transport {
}
}

fn is_shutdown(payload: &Payload) -> bool {
use lsp_types::request::{Request, Shutdown};
matches!(payload, Payload::Request { value: jsonrpc::MethodCall { method, .. }, .. } if method == Shutdown::METHOD)
}

// TODO: events that use capabilities need to do the right thing

loop {
Expand Down Expand Up @@ -391,7 +396,10 @@ impl Transport {
}
msg = client_rx.recv() => {
if let Some(msg) = msg {
if is_pending && !is_initialize(&msg) {
if is_pending && is_shutdown(&msg) {
log::info!("Language server not initialized, shutting down");
break;
} else if is_pending && !is_initialize(&msg) {
// ignore notifications
if let Payload::Notification(_) = msg {
continue;
Expand Down

0 comments on commit 008074d

Please sign in to comment.