Skip to content

Commit e3a42db

Browse files
authored
Add shutdown implementation (#1120)
1 parent b744e75 commit e3a42db

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

autoload/LanguageClient.vim

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,18 @@ function! LanguageClient#workspace_executeCommand(command, ...) abort
13601360
return LanguageClient#Call('workspace/executeCommand', l:params, l:Callback)
13611361
endfunction
13621362

1363+
function! s:shutdownCallback(...) abort
1364+
call LanguageClient#exit()
1365+
echom '[LC] Server shutdown complete'
1366+
endfunction
1367+
1368+
function! LanguageClient#shutdown() abort
1369+
return LanguageClient#Call('shutdown', {
1370+
\ 'languageId': &filetype,
1371+
\ },
1372+
\ function('s:shutdownCallback'))
1373+
endfunction
1374+
13631375
function! LanguageClient#exit() abort
13641376
return LanguageClient#Notify('exit', {
13651377
\ 'languageId': &filetype,

plugin/LanguageClient.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ function! LanguageClient_textDocument_switchSourceHeader(...)
151151
endfunction
152152

153153
command! -nargs=* LanguageClientStart :call LanguageClient#startServer(<f-args>)
154-
command! LanguageClientStop :call LanguageClient#exit()
154+
command! LanguageClientStop call LanguageClient#shutdown()
155155

156156
augroup languageClient
157157
autocmd!

src/language_server_protocol.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2782,6 +2782,22 @@ impl LanguageClient {
27822782
Ok(Value::Null)
27832783
}
27842784

2785+
#[tracing::instrument(level = "info", skip(self))]
2786+
pub fn shutdown(&self, params: &Value) -> Result<Value> {
2787+
let filename = self.vim()?.get_filename(params)?;
2788+
let language_id = self.vim()?.get_language_id(&filename, params)?;
2789+
2790+
let _: () = self
2791+
.get_client(&Some(language_id.clone()))?
2792+
.call(lsp_types::request::Shutdown::METHOD, Value::Null)?;
2793+
2794+
self.vim()?
2795+
.rpcclient
2796+
.notify("setbufvar", json!([filename, VIM_IS_SERVER_RUNNING, 0]))?;
2797+
2798+
Ok(Value::Null)
2799+
}
2800+
27852801
#[tracing::instrument(level = "info", skip(self))]
27862802
pub fn exit(&self, params: &Value) -> Result<()> {
27872803
let filename = self.vim()?.get_filename(params)?;
@@ -2794,13 +2810,10 @@ impl LanguageClient {
27942810
error!("Error: {:?}", err);
27952811
}
27962812

2797-
self.vim()?
2798-
.rpcclient
2799-
.notify("setbufvar", json!([filename, VIM_IS_SERVER_RUNNING, 0]))?;
2800-
28012813
if let Err(err) = self.cleanup(&language_id) {
28022814
error!("Error: {:?}", err);
28032815
}
2816+
28042817
Ok(())
28052818
}
28062819

@@ -3901,10 +3914,21 @@ impl LanguageClient {
39013914
return Ok(());
39023915
}
39033916

3917+
// we don't want to restart if the server was shut down by the user, so check
3918+
// VIM_IS_SERVER_RUNNING as that should be true at this point only if the server exited
3919+
// unexpectedly.
3920+
let filename = self.vim()?.get_filename(&Value::Null)?;
3921+
let is_running: u8 = self
3922+
.vim()?
3923+
.getbufvar(filename.as_str(), VIM_IS_SERVER_RUNNING)?;
3924+
let is_running = is_running == 1;
3925+
if !is_running {
3926+
return Ok(());
3927+
}
3928+
39043929
self.vim()?
39053930
.rpcclient
39063931
.notify("s:ExecuteAutocmd", "LanguageServerCrashed")?;
3907-
let filename = self.vim()?.get_filename(&Value::Null)?;
39083932
self.vim()?
39093933
.rpcclient
39103934
.notify("setbufvar", json!([filename, VIM_IS_SERVER_RUNNING, 0]))?;

src/rpchandler.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ impl LanguageClient {
9797
request::ResolveCompletionItem::METHOD => self.completion_item_resolve(&params),
9898
request::ExecuteCommand::METHOD => self.workspace_execute_command(&params),
9999
request::ApplyWorkspaceEdit::METHOD => self.workspace_apply_edit(&params),
100+
request::Shutdown::METHOD => self.shutdown(&params),
100101
request::DocumentHighlightRequest::METHOD => {
101102
self.text_document_document_highlight(&params)
102103
}

0 commit comments

Comments
 (0)