Function: eglot-imenu

eglot-imenu is a byte-compiled function defined in eglot.el.gz.

Signature

(eglot-imenu)

Documentation

Eglot's imenu-create-index-function.

Returns a list as described in docstring of imenu--index-alist.

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/eglot.el.gz
(defun eglot-imenu ()
  "Eglot's `imenu-create-index-function'.
Returns a list as described in docstring of `imenu--index-alist'."
  (cl-labels
      ((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)
                                  (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))))
     (seq-group-by
      (lambda (obj) (plist-get obj :kind))
      (mapcan #'unfurl
              (jsonrpc-request (eglot--current-server-or-lose)
                               :textDocument/documentSymbol
                               `(:textDocument
                                 ,(eglot--TextDocumentIdentifier))
                               :cancel-on-input non-essential))))))