]> git.eshelyaron.com Git - emacs.git/commitdiff
Cosmetic decisions guaranteed to tick off someone somewhere (tm)
authorJoão Távora <joaotavora@gmail.com>
Thu, 14 Jul 2022 09:09:27 +0000 (10:09 +0100)
committerJoão Távora <joaotavora@gmail.com>
Thu, 14 Jul 2022 14:47:12 +0000 (15:47 +0100)
The symbols returned by the LSP server must be converted to unique
strings if Emacs is to present them in a list.  On the other hand, the
search operates on the pattern and is completely controlled by the
backend.  There is not much Eglot, the LSP client, can do about this.

Decided to present the unique string to the user, even though it could
be hidden.  All the manner of :annotation-function,
:affixation-function, :group-funcion etc didn't seem to add much
value.

Grouping was especially useless, since it makes sense to respect the
LSP server's account of sorting score, so that better results bubble
up to the top.

* eglot.el (xref-backend-identifier-completion-table): Uniquify
symbols with containerName and kind.

GitHub-reference: per https://github.com/joaotavora/eglot/issues/131

lisp/progmodes/eglot.el

index eccd67c1296ec9a5cfbf035841703125cba5c161..6d3667a84a96f98e03f1d0d7291630435b165537 100644 (file)
@@ -2402,11 +2402,20 @@ Try to visit the target file for a richer summary line."
         (cl-labels ((refresh (pat)
                       (mapcar
                        (lambda (wss)
-                         (eglot--dbind ((WorkspaceSymbol) name containerName) wss
+                         (eglot--dbind
+                             ((WorkspaceSymbol) name containerName kind) wss
                            (propertize
-                            (concat (and (not (zerop (length containerName)))
-                                         (format "%s::" containerName))
-                                    name)
+                            (format "%s%s %s"
+                                    (if (zerop (length containerName)) ""
+                                        (concat (propertize containerName
+                                                            'face 'shadow)
+                                                " "))
+                                    name
+                                    (propertize (alist-get
+                                                 kind
+                                                 eglot--symbol-kind-names
+                                                 "Unknown")
+                                                'face 'shadow))
                             'eglot--lsp-workspaceSymbol wss)))
                        (with-current-buffer buf
                          (jsonrpc-request (eglot--current-server-or-lose)
@@ -2417,41 +2426,17 @@ Try to visit the target file for a richer summary line."
                              (probe (gethash pat cache :missing)))
                         (if (eq probe :missing) (puthash pat (refresh pat) cache)
                           probe)))
-                    (container (c)
-                      (plist-get (get-text-property
-                                  0 'eglot--lsp-workspaceSymbol c)
-                                 :containerName)))
+                    (score (c)
+                      (cl-getf (get-text-property
+                                0 'eglot--lsp-workspaceSymbol c)
+                               :score 0)))
           (lambda (string _pred action)
             (pcase action
               (`metadata `(metadata
                            (cycle-sort-function
                             . ,(lambda (completions)
-                                 (cl-sort completions
-                                          #'string-lessp
-                                          :key (lambda (c)
-                                                 (or (container c)
-                                                     "")))))
-                           (category . eglot-indirection-joy)
-                           ;; (annotation-function
-                           ;;  . ,(lambda (c)
-                           ;;       (plist-get (get-text-property
-                           ;;                   0 'eglot--lsp-workspaceSymbol c)
-                           ;;                  :containerName)))
-                           ;; (affixation-function
-                           ;;  . ,(lambda (comps)
-                           ;;       (mapcar (lambda (c)
-                           ;;                 (list c
-                           ;;                       (plist-get (get-text-property
-                           ;;                                   0 'eglot--lsp-workspaceSymbol c)
-                           ;;                                  :containerName)
-                           ;;                       " bla"))
-                           ;;               comps)))
-                           (group-function
-                            . ,(lambda (c transformp)
-                                 (if (not transformp)
-                                     (container c)
-                                   c)))
-                           ))
+                                 (cl-sort completions #'> :key #'score)))
+                           (category . eglot-indirection-joy)))
               (`(eglot--lsp-tryc . ,point) `(eglot--lsp-tryc . (,string . ,point)))
               (`(eglot--lsp-allc . ,_point) `(eglot--lsp-allc . ,(lookup string)))
               (_ nil)))))
@@ -2475,7 +2460,7 @@ Try to visit the target file for a richer summary line."
   ;; passed to LSP.  The reason for this particular wording is to
   ;; construct a readable message "No references for LSP identifier at
   ;; point.".   See https://github.com/joaotavora/eglot/issues/314
-  "LSP identifier at point.")
+  "LSP identifier at point")
 
 (defvar eglot--lsp-xref-refs nil
   "`xref' objects for overriding `xref-backend-references''s.")