Skip to content

Commit a06038c

Browse files
committed
Add shutdown implementation
1 parent 15fd62f commit a06038c

File tree

4 files changed

+42
-6
lines changed

4 files changed

+42
-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: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2782,6 +2782,21 @@ 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.get_client(&Some(language_id.clone()))?
2791+
.call(lsp_types::request::Shutdown::METHOD, Value::Null)?;
2792+
2793+
self.vim()?
2794+
.rpcclient
2795+
.notify("setbufvar", json!([filename, VIM_IS_SERVER_RUNNING, 0]))?;
2796+
2797+
Ok(Value::Null)
2798+
}
2799+
27852800
#[tracing::instrument(level = "info", skip(self))]
27862801
pub fn exit(&self, params: &Value) -> Result<()> {
27872802
let filename = self.vim()?.get_filename(params)?;
@@ -2794,13 +2809,10 @@ impl LanguageClient {
27942809
error!("Error: {:?}", err);
27952810
}
27962811

2797-
self.vim()?
2798-
.rpcclient
2799-
.notify("setbufvar", json!([filename, VIM_IS_SERVER_RUNNING, 0]))?;
2800-
28012812
if let Err(err) = self.cleanup(&language_id) {
28022813
error!("Error: {:?}", err);
28032814
}
2815+
28042816
Ok(())
28052817
}
28062818

@@ -3901,10 +3913,21 @@ impl LanguageClient {
39013913
return Ok(());
39023914
}
39033915

3916+
// we don't want to restart if the server was shut down by the user, so check
3917+
// VIM_IS_SERVER_RUNNING as that should be true at this point only if the server exited
3918+
// unexpectedly.
3919+
let filename = self.vim()?.get_filename(&Value::Null)?;
3920+
let is_running: u8 = self
3921+
.vim()?
3922+
.getbufvar(filename.as_str(), VIM_IS_SERVER_RUNNING)?;
3923+
let is_running = is_running == 1;
3924+
if !is_running {
3925+
return Ok(());
3926+
}
3927+
39043928
self.vim()?
39053929
.rpcclient
39063930
.notify("s:ExecuteAutocmd", "LanguageServerCrashed")?;
3907-
let filename = self.vim()?.get_filename(&Value::Null)?;
39083931
self.vim()?
39093932
.rpcclient
39103933
.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)