emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/eglot2emacs 41a42e631b 096/120: Don't return poorly supported "s


From: João Távora
Subject: feature/eglot2emacs 41a42e631b 096/120: Don't return poorly supported "special elements" in eglot-imenu
Date: Thu, 20 Oct 2022 07:17:06 -0400 (EDT)

branch: feature/eglot2emacs
commit 41a42e631bd798151130097feafa6f535161b9de
Author: João Távora <joaotavora@gmail.com>
Commit: João Távora <joaotavora@gmail.com>

    Don't return poorly supported "special elements" in eglot-imenu
    
    Fix https://github.com/joaotavora/eglot/issues/758, 
https://github.com/joaotavora/eglot/issues/536, 
https://github.com/joaotavora/eglot/issues/535.
    
    Eglot's eglot-imenu returned a structure compliant with the rules
    outlined in imenu--index-alist.  In particular, it returned some
    elements of the form
    
      (INDEX-NAME POSITION GOTO-FN ARGUMENTS...)
    
    The original intention (mine) must have been to allow fancy
    highlighting of the position navigated to with a custom GOTO-FN.
    
    Not only was access to that fanciness never implemented, but many
    other imenu frontends do not support such elements.
    
    See for example https://github.com/joaotavora/eglot/issues/758, 
https://github.com/joaotavora/eglot/issues/536, 
https://github.com/joaotavora/eglot/issues/535.  And also related issues in 
other
    packages:
    
    https://github.com/IvanMalison/flimenu/issues/6
    https://github.com/bmag/imenu-list/issues/58
    
    So it's best to remove this problematic feature for now.  It can be
    added back later.
    
    * eglot.el (eglot-imenu): Simplify.
    
    * NEWS.md: Mention change
---
 lisp/progmodes/eglot.el | 52 ++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 27 deletions(-)

diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 8088490363..2ac9b0dff6 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -2916,39 +2916,37 @@ for which LSP on-type-formatting should be requested."
       nil)))
 
 (defun eglot-imenu ()
-  "EGLOT's `imenu-create-index-function'."
+  "EGLOT's `imenu-create-index-function'.
+Returns a list as described in docstring of `imenu--index-alist'."
   (cl-labels
-      ((visit (_name one-obj-array)
-              (imenu-default-goto-function
-               nil (car (eglot--range-region
-                         (eglot--dcase (aref one-obj-array 0)
-                           (((SymbolInformation) location)
-                            (plist-get location :range))
-                           (((DocumentSymbol) selectionRange)
-                            selectionRange))))))
-       (unfurl (obj)
-               (eglot--dcase obj
-                 (((SymbolInformation)) (list obj))
-                 (((DocumentSymbol) name children)
-                  (cons obj
-                        (mapcar
-                         (lambda (c)
-                           (plist-put
-                            c :containerName
-                            (let ((existing (plist-get c :containerName)))
-                              (if existing (format "%s::%s" name existing)
-                                name))))
-                         (mapcan #'unfurl children)))))))
+      ((unfurl (obj)
+         (eglot--dcase obj
+           (((SymbolInformation)) (list obj))
+           (((DocumentSymbol) name children)
+            (cons obj
+                  (mapcar
+                   (lambda (c)
+                     (plist-put
+                      c :containerName
+                      (let ((existing (plist-get c :containerName)))
+                        (if existing (format "%s::%s" name existing)
+                          name))))
+                   (mapcan #'unfurl children)))))))
     (mapcar
      (pcase-lambda (`(,kind . ,objs))
        (cons
         (alist-get kind eglot--symbol-kind-names "Unknown")
         (mapcan (pcase-lambda (`(,container . ,objs))
-                  (let ((elems (mapcar (lambda (obj)
-                                         (list (plist-get obj :name)
-                                               `[,obj] ;; trick
-                                               #'visit))
-                                       objs)))
+                  (let ((elems (mapcar
+                                (lambda (obj)
+                                  (cons (plist-get obj :name)
+                                        (car (eglot--range-region
+                                              (eglot--dcase obj
+                                                (((SymbolInformation) location)
+                                                 (plist-get location :range))
+                                                (((DocumentSymbol) 
selectionRange)
+                                                 selectionRange))))))
+                                objs)))
                     (if container (list (cons container elems)) elems)))
                 (seq-group-by
                  (lambda (e) (plist-get e :containerName)) objs))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]