Function: smie-config--guess-1

smie-config--guess-1 is a byte-compiled function defined in smie.el.gz.

Signature

(smie-config--guess-1 SIGS)

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/smie.el.gz
(defun smie-config--guess-1 (sigs)
  (let ((ssigs nil)
        (rules nil))
    ;; Sort the sigs by frequency of occurrence.
    (maphash (lambda (sig sig-data) (push (cons sig sig-data) ssigs)) sigs)
    (setq ssigs (sort ssigs (lambda (sd1 sd2) (> (cadr sd1) (cadr sd2)))))
    (while ssigs
      (pcase-let ((`(,sig ,total ,off-alist ,cotraces) (pop ssigs)))
        (cl-assert (= total (apply #'+ (mapcar #'cdr off-alist))))
        (let* ((sorted-off-alist
                (sort off-alist (lambda (x y) (> (cdr x) (cdr y)))))
               (offset (caar sorted-off-alist)))
          (if (zerop offset)
              ;; Nothing to do with this sig; indentation is
              ;; correct already.
              nil
            (push (cons (+ offset (nth 2 sig)) sig) rules)
            ;; Adjust the rest of the data.
            (pcase-dolist ((and cotrace `(,count ,toffset . ,trace))
                           cotraces)
              (setf (nth 1 cotrace) (- toffset offset))
              (dolist (sig trace)
                (let ((sig-data (cdr (assq sig ssigs))))
                  (when sig-data
                    (let* ((ooff-data (assq toffset (nth 1 sig-data)))
                           (noffset (- toffset offset))
                           (noff-data
                            (or (assq noffset (nth 1 sig-data))
                                (let ((off-data (cons noffset 0)))
                                  (push off-data (nth 1 sig-data))
                                  off-data))))
                      (cl-assert (>= (cdr ooff-data) count))
                      (cl-decf (cdr ooff-data) count)
                      (cl-incf (cdr noff-data) count))))))))))
    rules))