From 791f84671157ca56bed06cfba8429bab0a784cec Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Fri, 28 Jul 2023 18:01:49 -0700 Subject: [PATCH] Auto import is not working with typescript language server. Fixes #367. --- autoload/lsp/completion.vim | 11 ++++++++++- autoload/lsp/lspserver.vim | 17 ++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/autoload/lsp/completion.vim b/autoload/lsp/completion.vim index 15f59c4..bd6094a 100644 --- a/autoload/lsp/completion.vim +++ b/autoload/lsp/completion.vim @@ -581,11 +581,20 @@ def LspCompleteDone(bnr: number) var completionData: any = v:completed_item->get('user_data', '') if completionData->type() != v:t_dict - || !completionData->has_key('additionalTextEdits') || !opt.lspOptions.completionTextEdit return endif + if !completionData->has_key('additionalTextEdits') + # Some language servers (e.g. typescript) delay the computation of the + # additional text edits. So try to resolve the completion item now to get + # the text edits. + completionData = lspserver.resolveCompletion(completionData, true) + if completionData->get('additionalTextEdits', {})->empty() + return + endif + endif + textedit.ApplyTextEdits(bnr, completionData.additionalTextEdits) enddef diff --git a/autoload/lsp/lspserver.vim b/autoload/lsp/lspserver.vim index fb64674..3686b44 100644 --- a/autoload/lsp/lspserver.vim +++ b/autoload/lsp/lspserver.vim @@ -697,16 +697,23 @@ enddef # Get lazy properties for a completion item. # Request: "completionItem/resolve" # Param: CompletionItem -def ResolveCompletion(lspserver: dict, item: dict): void +def ResolveCompletion(lspserver: dict, item: dict, sync: bool = false): dict # Check whether LSP server supports completion item resolve if !lspserver.isCompletionResolveProvider - util.ErrMsg('LSP server does not support completion item resolve') - return + return {} endif # interface CompletionItem - lspserver.rpc_a('completionItem/resolve', item, - completion.CompletionResolveReply) + if sync + var reply = lspserver.rpc('completionItem/resolve', item) + if !reply->empty() && !reply.result->empty() + return reply.result + endif + else + lspserver.rpc_a('completionItem/resolve', item, + completion.CompletionResolveReply) + endif + return {} enddef # Jump to or peek a symbol location. -- 2.48.1