]> git.eshelyaron.com Git - emacs.git/commitdiff
Flymake: promptly delete eol overlay if source overlay changed
authorJoão Távora <joaotavora@gmail.com>
Tue, 29 Apr 2025 11:34:10 +0000 (12:34 +0100)
committerEshel Yaron <me@eshelyaron.com>
Thu, 1 May 2025 05:40:00 +0000 (07:40 +0200)
In the vast majority of cases, changing the source overlay
invalidates the content of the end-of-line overlay, so best to
delete it asap.

* lisp/progmodes/flymake.el (flymake--delete-overlay): Use
'flymake--eol-ov'
(flymake--highlight-line): Use some overlay modification hooks.

(cherry picked from commit 825ea052ad5638c056037c4cac92c9e666dc3820)

lisp/progmodes/flymake.el

index 13c488b2cabb86506aaeedcfdee965a1f0cbbccf..32a78918fae2d83847ef41d85e76d4257848b8c2 100644 (file)
@@ -792,7 +792,7 @@ Return to original margin width if ORIG-WIDTH is non-nil."
 
 (defun flymake--delete-overlay (ov)
   "Like `delete-overlay', delete OV, but do some more stuff."
-  (let ((eolov (overlay-get ov 'eol-ov)))
+  (let ((eolov (overlay-get ov 'flymake--eol-ov)))
     (when eolov
       (let ((src-ovs (delq ov (overlay-get eolov 'flymake-eol-source-overlays))))
         (overlay-put eolov 'flymake-eol-source-overlays src-ovs)))
@@ -1098,6 +1098,11 @@ Return nil or the overlay created."
     ;;
     (overlay-put ov 'evaporate t)
     (overlay-put ov 'flymake-overlay t)
+    (overlay-put ov 'modification-hooks
+                 `(,(lambda (ov after &rest _)
+                      (when-let* ((eolov
+                                   (and (null after) (overlay-get ov 'flymake--eol-ov))))
+                        (delete-overlay eolov)))))
     (overlay-put ov 'flymake-diagnostic diagnostic)
     ;; Handle `flymake-show-diagnostics-at-end-of-line'
     ;;
@@ -1119,7 +1124,7 @@ Return nil or the overlay created."
             (overlay-put eolov 'flymake--eol-overlay t)
             (overlay-put eolov 'flymake-eol-source-overlays (list ov))
             (overlay-put eolov 'evaporate (not (= start end)))) ; FIXME: fishy
-          (overlay-put ov 'eol-ov eolov))))
+          (overlay-put ov 'flymake--eol-ov eolov))))
     ov))
 
 (defvar-local flymake--state nil