Function: clojure--remove-unused-keys-once

clojure--remove-unused-keys-once is a byte-compiled function defined in clojure-mode.el.

Signature

(clojure--remove-unused-keys-once TOP-LEVEL)

Documentation

Remove what the TOP-LEVEL form destructures from maps but doesn't use.

Return the names removed.

Source Code

;; Defined in ~/.emacs.d/elpa/clojure-mode-20261103.1226/clojure-mode.el
(defun clojure--remove-unused-keys-once (top-level)
  "Remove what the TOP-LEVEL form destructures from maps but doesn't use.
Return the names removed."
  (let ((sites (clojure--binding-sites top-level))
        (declared (make-hash-table))
        changes names vecs)
    (pcase-dolist (`(,_ ,pattern ,_) sites)
      (dolist (form (clojure--pattern-declarations pattern))
        (puthash (clojure--form-start form) t declared)))
    (pcase-dolist (`(,vec ,pattern ,end) sites)
      (let* ((in-scope (clojure--symbol-names top-level declared
                                              (clojure--form-start vec) end))
             (edits (clojure--unused-pattern-edits
                     pattern (lambda (name)
                               ;; A leading _ marks a name unused on purpose.
                               (or (string-prefix-p "_" name)
                                   (member name in-scope)
                                   (ignore (push name names)))))))
        (when edits
          (push (cons (copy-marker (clojure--form-start vec))
                      (copy-marker (clojure--form-end vec)))
                vecs))
        (pcase-dolist (`(,kind ,form . ,args) edits)
          (if (eq kind 'replace)
              (push (list (clojure--form-start form) (clojure--form-end form) (car args))
                    changes)
            (pcase-dolist (`(,beg . ,end) (clojure--removal-regions form args))
              (push (list beg end "") changes))))))
    ;; A change inside another one, like in an :or default that goes,
    ;; goes with it.
    (let (kept)
      (dolist (change (sort changes (lambda (a b)
                                      (if (= (car a) (car b))
                                          (> (cadr a) (cadr b))
                                        (< (car a) (car b))))))
        (cond
         ((or (null kept) (>= (car change) (cadr (car kept))))
          (push change kept))
         ((> (cadr change) (cadr (car kept)))
          (error "Overlapping edits at %d and %d" (caar kept) (car change)))))
      (setq changes kept))
    ;; From the end, so that the positions of the changes still to make
    ;; don't move.
    (pcase-dolist (`(,beg ,end ,text) changes)
      (goto-char beg)
      (delete-region beg end)
      (insert text))
    (pcase-dolist (`(,beg . ,end) vecs)
      ;; The line the vector starts on is the form's, which wasn't edited.
      (goto-char beg)
      (forward-line 1)
      (when (< (point) end)
        (indent-region (point) (marker-position end)))
      (set-marker beg nil)
      (set-marker end nil))
    (nreverse names)))