diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index f651dc9..f8b3c85 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -71,6 +71,7 @@ (require 'ring) (require 'pcase) (require 'project) +(require 'generator) (eval-when-compile (require 'semantic/symref)) ;; for hit-lines slot @@ -534,19 +535,12 @@ xref-query-replace-in-results (funcall iter :cleanup)))) (defun xref--buf-pairs-iterator (xrefs) - (let (chunk-done item next-pair file-buf pairs all-pairs) - (lambda (action) - (pcase action - (:next - (when (or xrefs next-pair) - (setq chunk-done nil) - (when next-pair - (setq file-buf (marker-buffer (car next-pair)) - pairs (list next-pair) - next-pair nil)) - (while (and (not chunk-done) - (setq item (pop xrefs))) - (save-excursion + (let* (item + file-buf pairs all-pairs + (iter + (funcall + (iter-lambda () + (while (setq item (pop xrefs)) (let* ((loc (xref-item-location item)) (beg (xref-location-marker loc)) (end (move-marker (make-marker) @@ -568,9 +562,19 @@ xref--buf-pairs-iterator ((equal file-buf (marker-buffer beg)) (push pair pairs)) (t - (setq chunk-done t - next-pair pair)))))))) - (cons file-buf (nreverse pairs)))) + (iter-yield (cons file-buf (nreverse pairs))) + (setq file-buf (marker-buffer beg) + pairs (list pair))))))) + (when (null xrefs) + (iter-yield (cons file-buf (nreverse pairs))))))))) + (lambda (action) + (pcase action + (:next + (condition-case nil + (save-excursion + (iter-next iter)) + (iter-end-of-sequence + nil))) (:cleanup (dolist (pair all-pairs) (move-marker (car pair) nil)