Eglot: display completion label when safe

Originally reported in
https://github.com/joaotavora/eglot/discussions/1141 by "Mintsoup".

Eglot doesn't always show the LSP :label property of a CompletionItem
in the completion candidates.  That is because label is sometimes not
what should be inserted in the buffer in the end, the :insertText
property supercedes it.

But the label is usually more suitable for display nevertheless and if
the LSP CompletionItem contains either a snippet or a textEdit, it's
safe to display the label, since :exit-function will guarantee that a
suitable buffer insertion is performed.

This change reflects that awareness that when a textEdit is available,
it's acceptable to show the label.

* lisp/progmodes/eglot.el (eglot-completion-at-point): Adjust.
This commit is contained in:
João Távora 2023-02-23 13:58:38 +00:00
parent 5286111ea1
commit e3be0dbf85

View file

@ -2824,16 +2824,20 @@ for which LSP on-type-formatting should be requested."
(mapcar
(jsonrpc-lambda
(&rest item &key label insertText insertTextFormat
&allow-other-keys)
textEdit &allow-other-keys)
(let ((proxy
(cond ((and (eql insertTextFormat 2)
(eglot--snippet-expansion-fn))
;; Snippet or textEdit, it's safe to
;; display/insert the label since
;; it'll be adjusted. If no usable
;; insertText at all, label is best,
;; too.
(cond ((or (and (eql insertTextFormat 2)
(eglot--snippet-expansion-fn))
textEdit
(null insertText)
(string-empty-p insertText))
(string-trim-left label))
((and insertText
(not (string-empty-p insertText)))
insertText)
(t
(string-trim-left label)))))
(t insertText))))
(unless (zerop (length proxy))
(put-text-property 0 1 'eglot--lsp-item item proxy))
proxy))