Function: clojure--unused-pattern-edits

clojure--unused-pattern-edits is a byte-compiled function defined in clojure-mode.el.

Signature

(clojure--unused-pattern-edits PATTERN USED-P)

Documentation

Return how to remove what PATTERN binds from maps but doesn't use.

USED-P tells if a name is used. The value is a list of (remove COLL FORM...) and (replace FORM TEXT) edits, or empty for a map with nothing left, which it's for the caller to replace or remove. Comments and discarded forms count as something left, but an empty :keys and an
:or with nothing but defaults don't, as they bind nothing.

Source Code

;; Defined in ~/.emacs.d/elpa/clojure-mode-20261103.1226/clojure-mode.el
(defun clojure--unused-pattern-edits (pattern used-p)
  "Return how to remove what PATTERN binds from maps but doesn't use.
USED-P tells if a name is used.  The value is a list of (remove COLL
FORM...) and (replace FORM TEXT) edits, or `empty' for a map with
nothing left, which it's for the caller to replace or remove.  Comments
and discarded forms count as something left, but an empty :keys and an
:or with nothing but defaults don't, as they bind nothing."
  (pcase pattern
    (`(vec ,_ . ,subs)
     (mapcan (lambda (sub)
               (let ((edits (clojure--unused-pattern-edits sub used-p)))
                 (if (eq edits 'empty) `((replace ,(cadr sub) "_")) edits)))
             subs))
    (`(map ,map . ,units)
     (let ((droppable 0) removed edits)
       (dolist (unit units)
         (pcase unit
           (`(keys ,key ,vec ,elems)
            (let ((unused (seq-filter (lambda (elem)
                                        (and (car elem) (not (funcall used-p (car elem)))))
                                      elems))
                  (children (clojure--form-children vec)))
              (cond
               ((null children) (setq droppable (+ droppable 2)))
               ((null unused))
               ((= (length unused) (length children))
                (setq removed `(,key ,vec ,@removed)))
               (t (push `(remove ,vec ,@(mapcar #'cdr unused)) edits)))))
           ((or `(as ,key ,val ,name) `(pair ,key ,val ,name))
            (unless (funcall used-p name)
              (setq removed `(,key ,val ,@removed))))
           (`(nested ,key ,val ,sub)
            (let ((sub-edits (clojure--unused-pattern-edits sub used-p)))
              (if (eq sub-edits 'empty)
                  (setq removed `(,key ,val ,@removed))
                (setq edits (append sub-edits edits)))))
           ;; The :or defaults of the names removed go with them.
           (`(or ,key ,val ,entries)
            (let ((unused (seq-remove (lambda (entry) (funcall used-p (car entry)))
                                      entries))
                  (children (clojure--form-children val)))
              (if (and unused (= (length children) (* 2 (length unused))))
                  (setq removed `(,key ,val ,@removed))
                (when unused
                  (push `(remove ,val ,@(seq-mapcat #'cdr unused)) edits))
                (when (= (length children) (length (clojure--form-values val)))
                  (setq droppable (+ droppable 2))))))))
       (cond
        ((and removed
              (= (length (clojure--form-children map)) (+ (length removed) droppable)))
         'empty)
        (removed (cons `(remove ,map ,@removed) edits))
        (t edits))))))