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
# Get lazy properties for a completion item.
# Request: "completionItem/resolve"
# Param: CompletionItem
-def ResolveCompletion(lspserver: dict<any>, item: dict<any>): void
+def ResolveCompletion(lspserver: dict<any>, item: dict<any>, sync: bool = false): dict<any>
# 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.