emacs-diffs
[Top][All Lists]
Advanced

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

master 76cdf293c48: Eglot: better consider diagnostics at point on code


From: João Távora
Subject: master 76cdf293c48: Eglot: better consider diagnostics at point on code action requests
Date: Wed, 20 Sep 2023 06:01:10 -0400 (EDT)

branch: master
commit 76cdf293c480c3825eb99eae0ab863d185cf6570
Author: João Távora <joaotavora@gmail.com>
Commit: João Távora <joaotavora@gmail.com>

    Eglot: better consider diagnostics at point on code action requests
    
    * 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          |  7 +++++++
 lisp/progmodes/eglot.el | 21 ++++++++++++++-------
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/etc/EGLOT-NEWS b/etc/EGLOT-NEWS
index ffc8095f752..f5f78ccd483 100644
--- a/etc/EGLOT-NEWS
+++ b/etc/EGLOT-NEWS
@@ -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
+
 
 * Changes in Eglot 1.15 (29/4/2023)
 
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 79b3dbb2994..e511df01850 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -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")



reply via email to

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