From ee794a8d5ec095fabe0ce4b682b665cb97d3301d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Wed, 30 Oct 2019 01:24:10 +0000 Subject: [PATCH] Use completionitem/resolve more abundantly It was already used to resolve documentation bits of completions, but it can also be useful to resolve snippet templates and such. To resolve a completion, you need some part of a completion to start with. If it has a :data field exists and the server supports :resolveProvider, fetch the new object, otherwise use whatever we had already. * eglot.el (eglot-completion-at-point): Add another local function for resolving completions. GitHub-reference: per https://github.com/joaotavora/eglot/issues/50 --- lisp/progmodes/eglot.el | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 1f7a396ef98..bce4ee08b15 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -1979,6 +1979,20 @@ is not active." (put-text-property 0 1 'eglot--lsp-item item proxy)) proxy)) items))))) + resolved + (resolve-maybe + ;; Maybe completion/resolve JSON object `lsp-comp' into + ;; another JSON object, if at all possible. Otherwise, + ;; just return lsp-comp. + (lambda (lsp-comp) + (cond (resolved resolved) + ((and (eglot--server-capable :completionProvider + :resolveProvider) + (plist-get lsp-comp :data)) + (setq resolved + (jsonrpc-request server :completionItem/resolve + lsp-comp :cancel-on-input t))) + (t lsp-comp)))) (bounds (bounds-of-thing-at-point 'symbol))) (list (or (car bounds) (point)) @@ -2021,13 +2035,7 @@ is not active." (lambda (proxy) (let* ((documentation (let ((lsp-comp (get-text-property 0 'eglot--lsp-item proxy))) - (or (plist-get lsp-comp :documentation) - (and (eglot--server-capable :completionProvider - :resolveProvider) - (plist-get - (jsonrpc-request server :completionItem/resolve - lsp-comp :cancel-on-input t) - :documentation))))) + (plist-get (funcall resolve-maybe lsp-comp) :documentation))) (formatted (and documentation (eglot--format-markup documentation)))) (when formatted @@ -2050,13 +2058,15 @@ is not active." insertText textEdit additionalTextEdits) - (or (get-text-property 0 'eglot--lsp-item proxy) - ;; When selecting from the *Completions* - ;; buffer, `proxy' won't have any properties. A - ;; lookup should fix that (github#148) - (get-text-property - 0 'eglot--lsp-item - (cl-find proxy (funcall proxies) :test #'string=))) + (funcall + resolve-maybe + (or (get-text-property 0 'eglot--lsp-item proxy) + ;; When selecting from the *Completions* + ;; buffer, `proxy' won't have any properties. + ;; A lookup should fix that (github#148) + (get-text-property + 0 'eglot--lsp-item + (cl-find proxy (funcall proxies) :test #'string=)))) (let ((snippet-fn (and (eql insertTextFormat 2) (eglot--snippet-expansion-fn)))) (cond (textEdit -- 2.39.2