autoload/lsp/completion.vim | 11 ++++++++++- autoload/lsp/lspserver.vim | 17 ++++++++++++----- diff --git a/autoload/lsp/completion.vim b/autoload/lsp/completion.vim index 15f59c4ae94c511f59947313ea4c917e465bed79..bd6094a74be266572a3f5a4df5f799d4f21784e0 100644 --- a/autoload/lsp/completion.vim +++ b/autoload/lsp/completion.vim @@ -581,9 +581,18 @@ endif 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) diff --git a/autoload/lsp/lspserver.vim b/autoload/lsp/lspserver.vim index fb64674cfc92714b5465561ebcffe868176fc36a..3686b4446d5f4881cdbab3ae3163520250e7014b 100644 --- a/autoload/lsp/lspserver.vim +++ b/autoload/lsp/lspserver.vim @@ -697,16 +697,23 @@ # 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.