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)))