autoload/lspserver.vim | 22 +++++++++++++++++++++- test/unit_tests.vim | 3 --- diff --git a/autoload/lspserver.vim b/autoload/lspserver.vim index d3b2bd529b4b4f895cb4df6539a3c079900a9d1f..c739389ebe7e514408ee83942afa740e12dc3925 100644 --- a/autoload/lspserver.vim +++ b/autoload/lspserver.vim @@ -279,6 +279,18 @@ ch->ch_sendraw(msg) ch->ch_sendraw(payload_js) enddef +# Wait for a response message from the LSP server for the request "req" +# Waits for a maximum of 5 seconds +def s:waitForReponse(lspserver: dict, req: dict) + var maxCount: number = 500 + var key: string = req.id->string() + + while lspserver.requests->has_key(key) && maxCount > 0 + sleep 10m + maxCount -= 1 + endwhile +enddef + # Send a LSP "textDocument/didOpen" notification # Params: DidOpenTextDocumentParams def s:textdocDidOpen(lspserver: dict, bnr: number, ftype: string): void @@ -415,7 +427,7 @@ enddef # Request: "textDocument/definition" # Param: DefinitionParams -def s:gotoDefinition(lspserver: dict, peek: bool): void +def s:gotoDefinition(lspserver: dict, peek: bool) # Check whether LSP server supports jumping to a definition if !lspserver.caps->has_key('definitionProvider') || !lspserver.caps.definitionProvider @@ -432,6 +444,8 @@ # interface DefinitionParams # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) lspserver.sendMessage(req) + + s:waitForReponse(lspserver, req) enddef # Request: "textDocument/declaration" @@ -455,6 +469,8 @@ # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) lspserver.sendMessage(req) + + s:waitForReponse(lspserver, req) enddef # Request: "textDocument/typeDefinition" @@ -478,6 +494,8 @@ # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) lspserver.sendMessage(req) + + s:waitForReponse(lspserver, req) enddef # Request: "textDocument/implementation" @@ -501,6 +519,8 @@ # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) lspserver.sendMessage(req) + + s:waitForReponse(lspserver, req) enddef # get symbol signature help. diff --git a/test/unit_tests.vim b/test/unit_tests.vim index 8703ae3adf5c00dcd64b07e4411e91c2e2aae1f3..e6527f726cc9f34b489a6ec3888da0340dea5e99 100644 --- a/test/unit_tests.vim +++ b/test/unit_tests.vim @@ -423,17 +423,14 @@ setline(1, lines) :sleep 1 cursor(24, 6) :LspGotoDeclaration - :sleep 1 assert_equal([6, 19], [line('.'), col('.')]) exe "normal! \" assert_equal([24, 6], [line('.'), col('.')]) :LspGotoDefinition - :sleep 1 assert_equal([9, 12], [line('.'), col('.')]) exe "normal! \" assert_equal([24, 6], [line('.'), col('.')]) :LspGotoImpl - :sleep 1 assert_equal([15, 11], [line('.'), col('.')]) exe "normal! \" assert_equal([24, 6], [line('.'), col('.')])