Subject: bug#64274: 30.0.50; Eglot requests textDocument/documentSymbol if its not declared in the server capabilities

From: João Távora <[email-masked]>
Date: Sun, 25 Jun 2023 00:06:00 +0100

Wilhelm Kirschbaum <[email-masked]> writes:

>> Thanks, i think the patch is in the right direction, but you could
>> use eglot--server-capable-or-lose.
>>
>
> The idea is to transparently just fall back to the non-eglot imenu and
> not sure if I want to see a warning for this every time imenu gets
> called. > Can you test it?

OK, this makes sense.  Then please test this instead.

João

diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index e2478f2dde3..c353ab6fce0 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -3348,9 +3348,11 @@ eglot--imenu-DocumentSymbol
                             (mapcar (lambda (c) (apply #'dfs c)) children))))))
     (mapcar (lambda (s) (apply #'dfs s)) res)))
 
-(defun eglot-imenu ()
+(cl-defun eglot-imenu ()
   "Eglot's `imenu-create-index-function'.
 Returns a list as described in docstring of `imenu--index-alist'."
+  (unless (eglot--server-capable :textDocument/documentSymbol)
+    (cl-return-from eglot-imenu))
   (let* ((res (eglot--request (eglot--current-server-or-lose)
                               :textDocument/documentSymbol
                               `(:textDocument