]> git.eshelyaron.com Git - emacs.git/commitdiff
Eglot: careful when invoking code actions on no symbol at all
authorJoão Távora <joaotavora@gmail.com>
Sat, 6 Jan 2024 23:56:33 +0000 (17:56 -0600)
committerJoão Távora <joaotavora@gmail.com>
Sun, 7 Jan 2024 00:12:14 +0000 (18:12 -0600)
Invoking code actions without a marked region or over a symbol
will trip certain servers up since BEG and END in eglot-code-actions
will be nil, causing 'eglot--pos-to-lsp-position' to assume point (which
is OK) but the 'flymake-diagnostics' call to return all diagnostics.

This causes an absolutely undecipherable JavaScript backtrace to be
sent back to Eglot from typescript-language-server.

Github-reference: https://github.com/joaotavora/eglot/issues/847

* lisp/progmodes/eglot.el (eglot--code-action-bounds): Avoid returning
  (list nil nil)

lisp/progmodes/eglot.el

index d330e6e23cb82b8c4961442c04d1d261787e59b3..ba2cc72a6b49f8a3cc9e7a5fe7935ea4a52eef75 100644 (file)
@@ -3605,16 +3605,17 @@ edit proposed by the server."
 
 (defun eglot--code-action-bounds ()
   "Calculate appropriate bounds depending on region and point."
-  (let (diags)
+  (let (diags boftap)
     (cond ((use-region-p) `(,(region-beginning) ,(region-end)))
           ((setq diags (flymake-diagnostics (point)))
            (cl-loop for d in diags
                     minimizing (flymake-diagnostic-beg d) into beg
                     maximizing (flymake-diagnostic-end d) into end
                     finally (cl-return (list beg end))))
+          ((setq boftap (bounds-of-thing-at-point 'sexp))
+           (list (car boftap) (cdr boftap)))
           (t
-           (let ((boftap (bounds-of-thing-at-point 'sexp)))
-             (list (car boftap) (cdr boftap)))))))
+           (list (point) (point))))))
 
 (defun eglot-code-actions (beg &optional end action-kind interactive)
   "Find LSP code actions of type ACTION-KIND between BEG and END.