Skip to content

Commit

Permalink
Per joaotavora/eglot#50: use completionItem/resolve more abundantly
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
joaotavora committed Oct 30, 2019
1 parent f54cc2e commit ad144ad
Showing 1 changed file with 24 additions and 14 deletions.
38 changes: 24 additions & 14 deletions eglot.el
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit ad144ad

Please sign in to comment.