From: Yegappan Lakshmanan Date: Mon, 17 Jan 2022 20:19:02 +0000 (-0800) Subject: When jumping to the location of a symbol, wait for the response from LSP server X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=b4e8a916f3c59727d5128ff226e8640a3203ddd8;p=vim-lsp.git When jumping to the location of a symbol, wait for the response from LSP server --- diff --git a/autoload/lspserver.vim b/autoload/lspserver.vim index d3b2bd5..c739389 100644 --- a/autoload/lspserver.vim +++ b/autoload/lspserver.vim @@ -279,6 +279,18 @@ def s:sendMessage(lspserver: dict, content: dict): void 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 @@ def s:gotoDefinition(lspserver: dict, peek: bool): void # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) lspserver.sendMessage(req) + + s:waitForReponse(lspserver, req) enddef # Request: "textDocument/declaration" @@ -455,6 +469,8 @@ def s:gotoDeclaration(lspserver: dict, peek: bool): void req.params->extend(s:getLspTextDocPosition()) lspserver.sendMessage(req) + + s:waitForReponse(lspserver, req) enddef # Request: "textDocument/typeDefinition" @@ -478,6 +494,8 @@ def s:gotoTypeDef(lspserver: dict, peek: bool): void req.params->extend(s:getLspTextDocPosition()) lspserver.sendMessage(req) + + s:waitForReponse(lspserver, req) enddef # Request: "textDocument/implementation" @@ -501,6 +519,8 @@ def s:gotoImplementation(lspserver: dict, peek: bool): void 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 8703ae3..e6527f7 100644 --- a/test/unit_tests.vim +++ b/test/unit_tests.vim @@ -423,17 +423,14 @@ def Test_lsp_goto_definition() :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('.')])