From 4d8fd9cf338cf9b5dfc613657adfeabff2d9c14e Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Wed, 4 May 2016 01:59:29 +0300 Subject: [PATCH] Handle "empty line" regexp in xref searches * lisp/progmodes/xref.el (xref--collect-matches-1): Stop after one match if re-search-forward doesn't move point (bug#23426). * test/automated/xref-tests.el (xref-collect-matches-finds-an-empty-line-regexp-match): Uncomment test. --- lisp/progmodes/xref.el | 6 +++++- test/automated/xref-tests.el | 14 +++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index 540c7b0e92..62cef23598 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -1016,7 +1016,11 @@ directory, used as the root of the ignore globs." (syntax-propertize line-end) ;; FIXME: This results in several lines with the same ;; summary. Solve with composite pattern? - (while (re-search-forward regexp line-end t) + (while (and + ;; REGEXP might match an empty string. Or line. + (or (null matches) + (> (point) line-beg)) + (re-search-forward regexp line-end t)) (let* ((beg-column (- (match-beginning 0) line-beg)) (end-column (- (match-end 0) line-beg)) (loc (xref-make-file-location file line beg-column)) diff --git a/test/automated/xref-tests.el b/test/automated/xref-tests.el index 1b500c3c41..28ca3511c2 100644 --- a/test/automated/xref-tests.el +++ b/test/automated/xref-tests.el @@ -28,10 +28,10 @@ (should (equal 0 (xref-file-location-column (nth 0 locs)))) (should (equal 4 (xref-file-location-column (nth 1 locs)))))) -;; (ert-deftest xref-collect-matches-finds-an-empty-line-regexp-match () -;; (let* ((matches (xref-collect-matches "^$" "*" xref-tests-data-dir nil)) -;; (locs (mapcar #'xref-item-location matches))) -;; (should (= 1 (length matches))) -;; (should (string-match-p "file2\\.txt\\'" (xref-location-group (nth 0 locs)))) -;; (should (equal 1 (xref-location-line (nth 0 locs)))) -;; (should (equal 0 (xref-file-location-column (nth 0 locs)))))) +(ert-deftest xref-collect-matches-finds-an-empty-line-regexp-match () + (let* ((matches (xref-collect-matches "^$" "*" xref-tests-data-dir nil)) + (locs (mapcar #'xref-item-location matches))) + (should (= 1 (length matches))) + (should (string-match-p "file2\\.txt\\'" (xref-location-group (nth 0 locs)))) + (should (equal 1 (xref-location-line (nth 0 locs)))) + (should (equal 0 (xref-file-location-column (nth 0 locs)))))) -- 2.39.2