]> git.eshelyaron.com Git - emacs.git/commitdiff
Use completionitem/resolve more abundantly
authorJoão Távora <joaotavora@gmail.com>
Wed, 30 Oct 2019 01:24:10 +0000 (01:24 +0000)
committerJoão Távora <joaotavora@gmail.com>
Wed, 30 Oct 2019 19:08:25 +0000 (19:08 +0000)
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

index 1f7a396ef980cb48563e968dc7e904da9bf23281..bce4ee08b1596b43176ad9a5f891f369d9cb1814 100644 (file)
@@ -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