]> git.eshelyaron.com Git - emacs.git/commitdiff
Fri Jun 7 13:06:53 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorRoland McGrath <roland@gnu.org>
Fri, 7 Jun 1996 17:31:33 +0000 (17:31 +0000)
committerRoland McGrath <roland@gnu.org>
Fri, 7 Jun 1996 17:31:33 +0000 (17:31 +0000)
* etags.el (tag-lines-already-matched): Remove defvar.
(initialize-new-tags-table): Don't make that var local.
(tag-lines-already-matched): Add docless defvar near find-tag-in-order
  defun; this is a global state variable for that one function.
(find-tag-in-order): Move clearing of tag-lines-already-matched out of
  loop.  Make it a list of markers and search it with member; it is now
  global, not buffer-local in the tags table, and records all matches in
  any tags table during a single find-tag loop.  When we run out of
  matches, clear it and null out the markers.

lisp/progmodes/etags.el

index 64f2e1d7afbf790e1946378f110ebdf4ecedb583..8954b1364b63707c0cd98885dbccf3c1f9801049 100644 (file)
@@ -100,10 +100,6 @@ Pop back to the last location with \\[negative-argument] \\[find-tag].")
 ;; Tags table state.
 ;; These variables are local in tags table buffers.
 
-(defvar tag-lines-already-matched nil
-  "List of positions of beginnings of lines within the tags table
-that are already matched.")
-
 (defvar tags-table-files nil
   "List of file names covered by current tags table.
 nil means it has not yet been computed; use `tags-table-files' to do so.")
@@ -164,7 +160,6 @@ One argument, the tag info returned by `snarf-tag-function'.")
 ;; non-nil return, the tags table state variable are
 ;; made buffer-local and initialized to nil.
 (defun initialize-new-tags-table ()
-  (set (make-local-variable 'tag-lines-already-matched) nil)
   (set (make-local-variable 'tags-table-files) nil)
   (set (make-local-variable 'tags-completion-table) nil)
   (set (make-local-variable 'tags-included-tables) nil)
@@ -876,6 +871,8 @@ See documentation of variable `tags-file-name'."
 ;; specified source file and return.  Qualified matches are remembered to
 ;; avoid repetition.  State is saved so that the loop can be continued.
 
+(defvar tag-lines-already-matched nil) ;matches remembered here between calls
+
 (defun find-tag-in-order (pattern
                          search-forward-func
                          order
@@ -886,11 +883,23 @@ See documentation of variable `tags-file-name'."
        tag-info                        ;where to find the tag in FILE
        (first-table t)
        (tag-order order)
+       (match-marker (make-marker))
        goto-func
        )
     (save-excursion
-      (or first-search                 ;find-tag-noselect has already done it.
-         (visit-tags-table-buffer 'same))
+
+      (if first-search
+         ;; This is the start of a search for a fresh tag.
+         ;; Clear the list of tags matched by the previous search.
+         ;; find-tag-noselect has already put us in the first tags table
+         ;; buffer before we got called.
+         (setq tag-lines-already-matched nil)
+       ;; Continuing to search for the tag specified last time.
+       ;; tag-lines-already-matched lists locations matched in previous
+       ;; calls so we don't visit the same tag twice if it matches twice
+       ;; during two passes with different qualification predicates.
+       ;; Switch to the current tags table buffer.
+       (visit-tags-table-buffer 'same))
 
       ;; Get a qualified match.
       (catch 'qualified-match-found
@@ -899,9 +908,6 @@ See documentation of variable `tags-file-name'."
        (while (or first-table
                   (visit-tags-table-buffer t))
 
-         (if first-search
-             (setq tag-lines-already-matched nil))
-
          (and first-search first-table
               ;; Start at beginning of tags file.
               (goto-char (point-min)))
@@ -914,9 +920,10 @@ See documentation of variable `tags-file-name'."
              ;; Naive match found.  Qualify the match.
              (and (funcall (car order) pattern)
                   ;; Make sure it is not a previous qualified match.
-                  ;; Use of `memq' depends on numbers being eq.
-                  (not (memq (save-excursion (beginning-of-line) (point))
-                             tag-lines-already-matched))
+                  (not (member (set-marker match-marker (save-excursion
+                                                          (beginning-of-line)
+                                                          (point)))
+                               tag-lines-already-matched))
                   (throw 'qualified-match-found nil))
              (if next-line-after-failure-p
                  (forward-line 1)))
@@ -925,12 +932,18 @@ See documentation of variable `tags-file-name'."
            (goto-char (point-min)))
          (setq order tag-order))
        ;; We throw out on match, so only get here if there were no matches.
+       ;; Clear out the markers we use to avoid duplicate matches so they
+       ;; don't slow down editting and are immediately available for GC.
+       (while tag-lines-already-matched
+         (set-marker (car tag-lines-already-matched) nil nil)
+         (setq tag-lines-already-matched (cdr tag-lines-already-matched)))
+       (set-marker match-marker nil nil)
        (error "No %stags %s %s" (if first-search "" "more ")
               matching pattern))
 
       ;; Found a tag; extract location info.
       (beginning-of-line)
-      (setq tag-lines-already-matched (cons (point)
+      (setq tag-lines-already-matched (cons match-marker
                                            tag-lines-already-matched))
       ;; Expand the filename, using the tags table buffer's default-directory.
       (setq file (expand-file-name (file-of-tag))