branch: elpa/flymake-collection
commit 6ca15100d19a1bde15710794e93312a2e40daa96
Author: Mohsin Kaleem <mohk...@kisara.moe>
Commit: Mohsin Kaleem <mohk...@kisara.moe>

    (commands): Refactor flymake-rest-change-checker
    
    There seems to have been a bug in the prior implementation. Newer
    versions of emacs expect the affixation a function to return a list of
    length 3 tuples instead of a formatted string.
    
    Also I've just generally refactored the massive command into 3
    sub-functions.
---
 flymake-rest-commands.el | 120 ++++++++++++++++++++++++-----------------------
 1 file changed, 62 insertions(+), 58 deletions(-)

diff --git a/flymake-rest-commands.el b/flymake-rest-commands.el
index 22750289c9..8ee6c69b0d 100644
--- a/flymake-rest-commands.el
+++ b/flymake-rest-commands.el
@@ -25,67 +25,71 @@
 (require 'flymake)
 (require 'flymake-rest-hook)
 
+(defun flymake-rest-change-checker--cands (all-modes)
+  (cl-remove-duplicates
+   (cl-loop for (mode . checkers) in
+            (if all-modes
+                flymake-rest-config
+              (list (assoc major-mode flymake-rest-config)))
+            append
+            (cl-loop for it in checkers
+                     with checker = nil
+                     do (setq checker (if (symbolp it)
+                                          it
+                                        (car it)))
+                     with exists = nil
+                     do (setq exists (or (member checker 
flymake-diagnostic-functions)
+                                         (when-let ((state (gethash checker 
flymake--backend-state)))
+                                           (not 
(flymake--backend-state-disabled state)))))
+                     when checker
+                     collect (list (symbol-name checker)
+                                   mode checker exists)))
+   :test (lambda (a b) (string-equal (car a) (car b)))))
+
+(defun flymake-rest-change-checker--read-checkers (&optional all-modes)
+  (let* ((cands (flymake-rest-change-checker--cands all-modes))
+         (group-function (lambda (cand transform)
+                           (if transform
+                               cand
+                             (symbol-name (cadr (assoc cand cands))))))
+         (affix-function (lambda (cands-keys)
+                           (cl-loop
+                            for cand in cands-keys collect
+                            (list cand (if (cadddr (assoc cand cands)) "-" 
"+") nil)))))
+    (unless cands
+      (user-error "No diagnostic functions configured for the current buffer"))
+    (mapcar
+     (lambda (it)
+       (assoc it cands))
+     (completing-read-multiple
+      "Diagnostic function: "
+      (lambda (str pred action)
+        (if (eq action 'metadata)
+            `(metadata
+              (group-function . ,group-function)
+              (affixation-function . ,affix-function))
+          (complete-with-action action cands str pred)))
+      nil t))))
+
 ;;;###autoload
-(defun flymake-rest-change-checker (&optional arg)
+(defun flymake-rest-change-checker (checkers)
   "Interactively select and enable/disable checker for the current 
`major-mode'.
 With ARG select a checker regardless of `major-mode'."
-  (interactive "P")
-  (let ((cands
-         (cl-remove-duplicates
-          (cl-loop for (mode . checkers) in
-                   (if arg
-                       flymake-rest-config
-                     (list (assoc major-mode flymake-rest-config)))
-                   append
-                   (cl-loop for it in checkers
-                            with checker = nil
-                            do (setq checker (if (symbolp it)
-                                                 it
-                                               (car it)))
-                            with exists = nil
-                            do (setq exists (or (member checker 
flymake-diagnostic-functions)
-                                                (when-let ((state (gethash 
checker flymake--backend-state)))
-                                                  (not 
(flymake--backend-state-disabled state)))))
-                            when checker
-                              collect (list (symbol-name checker)
-                                            mode checker exists)))
-          :test (lambda (a b) (string-equal (car a) (car b))))))
-    (unless cands
-      (user-error "No diagnostic functions configured for the current buffer"))
-    (cl-loop for (_cand _mode checker exists) in
-             (mapcar (lambda (it)
-                       (assoc it cands))
-                     (completing-read-multiple
-                      "Diagnostic function: "
-                      (lambda (str pred action)
-                        (if (eq action 'metadata)
-                            `(metadata
-                              ;; Group by the mode this diagnostic function 
was configured for.
-                              (group-function . ,(lambda (cand transform)
-                                                   (if transform
-                                                       cand
-                                                     (symbol-name (cadr (assoc 
cand cands))))))
-                              (affixation-function . ,(lambda (cands2)
-                                                        (cl-loop
-                                                         for cand in cands2
-                                                         collect
-                                                         (propertize cand
-                                                                     'display
-                                                                     (concat 
(if (cadddr (assoc cand cands)) "-" "+")
-                                                                             
cand))))))
-                          (complete-with-action action cands str pred)))
-                      nil t))
-             ;; Flymake doesn't let us remove a backend once we've added it, 
simply
-             ;; disable it.
-             do (if (member checker flymake-diagnostic-functions)
-                    (if exists ;; not disabled
-                        ;; WARN: For some reason disabling the backend doesn't 
clear any
-                        ;; existing reports for it.
-                        (flymake--disable-backend checker "user chose to 
disable it")
-                      (flymake--run-backend checker))
-                  (add-hook 'flymake-diagnostic-functions checker nil t)))
-    (when (called-interactively-p 'interactive)
-      (flymake-start))))
+  (interactive (list (flymake-rest-change-checker--read-checkers 
current-prefix-arg)))
+  (when checkers
+    (dolist (checker checkers)
+      (cl-destructuring-bind (_cand _mode checker exists) checker
+        ;; Flymake doesn't let us remove a backend once we've added it, simply
+        ;; disable it.
+        (if (member checker flymake-diagnostic-functions)
+            (if exists ;; not disabled
+                ;; WARN: For some reason disabling the backend doesn't clear 
any
+                ;; existing reports for it.
+                (flymake--disable-backend checker "User chose to disable it")
+              (flymake--run-backend checker))
+          (add-hook 'flymake-diagnostic-functions checker nil t)))
+      (when (called-interactively-p 'interactive)
+        (flymake-start)))))
 
 (provide 'flymake-rest-commands)
 

Reply via email to