]> git.eshelyaron.com Git - emacs.git/commitdiff
Eglot: better consider diagnostics at point on code action requests
authorJoão Távora <joaotavora@gmail.com>
Wed, 20 Sep 2023 10:00:19 +0000 (11:00 +0100)
committerJoão Távora <joaotavora@gmail.com>
Wed, 20 Sep 2023 10:02:51 +0000 (11:02 +0100)
* lisp/progmodes/eglot.el (eglot--code-action-bounds): Rename from
eglot--code-action-bounds.  Rework to consider diagnostics.
(eglot-code-actions): Use new eglot--code-action-bounds.
(eglot--code-action): Use new eglot--code-action-bounds.

* etc/EGLOT-NEWS: mention change.

GitHub-reference: https://github.com/joaotavora/eglot/discussions/1295

etc/EGLOT-NEWS
lisp/progmodes/eglot.el

index ffc8095f75263a45021a6a5ea91cf497a03789ca..f5f78ccd483dd0081a4df3f27c90cb723efd7eda 100644 (file)
@@ -43,6 +43,13 @@ For 'newline' commands, Eglot sometimes sent the wrong character code
 to the server.  Also made this feature less chatty in the mode-line
 and messages buffer.
 
+** Improve mouse invocation of code actions
+
+When invoking code actions by middle clicking with the mouse on
+Flymake diagnostics, it was often the case that Eglot didn't request
+code actions correctly and thus no actions were offered to the user.
+This has been fixed. github#1295
+
 \f
 * Changes in Eglot 1.15 (29/4/2023)
 
index 79b3dbb299416851155c7a34f75aa27ed4f638a8..e511df018502e832aabaca971e05979434cf2765 100644 (file)
@@ -3579,11 +3579,18 @@ edit proposed by the server."
                                           :newName ,newname))
    this-command))
 
-(defun eglot--region-bounds ()
-  "Region bounds if active, else bounds of things at point."
-  (if (use-region-p) `(,(region-beginning) ,(region-end))
-    (let ((boftap (bounds-of-thing-at-point 'sexp)))
-      (list (car boftap) (cdr boftap)))))
+(defun eglot--code-action-bounds ()
+  "Calculate appropriate bounds depending on region and point."
+  (let (diags)
+    (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))))
+          (t
+           (let ((boftap (bounds-of-thing-at-point 'sexp)))
+             (list (car boftap) (cdr boftap)))))))
 
 (defun eglot-code-actions (beg &optional end action-kind interactive)
   "Find LSP code actions of type ACTION-KIND between BEG and END.
@@ -3593,7 +3600,7 @@ Interactively, default BEG and END to region's bounds else BEG is
 point and END is nil, which results in a request for code actions
 at point.  With prefix argument, prompt for ACTION-KIND."
   (interactive
-   `(,@(eglot--region-bounds)
+   `(,@(eglot--code-action-bounds)
      ,(and current-prefix-arg
            (completing-read "[eglot] Action kind: "
                             '("quickfix" "refactor.extract" "refactor.inline"
@@ -3656,7 +3663,7 @@ at point.  With prefix argument, prompt for ACTION-KIND."
   "Define NAME to execute KIND code action."
   `(defun ,name (beg &optional end)
      ,(format "Execute `%s' code actions between BEG and END." kind)
-     (interactive (eglot--region-bounds))
+     (interactive (eglot--code-action-bounds))
      (eglot-code-actions beg end ,kind t)))
 
 (eglot--code-action eglot-code-action-organize-imports "source.organizeImports")