[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++
From: |
Dmitry Gutov |
Subject: |
bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files. |
Date: |
Thu, 28 May 2015 15:59:20 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.0 |
And here's an attempt to simplify the regexp and use the input string.
It brings us down to 200ms in the best case (completions for "get_"),
and that can be improved further, but the worst case (completions for
"") gets considerably worse: 3 seconds.
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 9ff164e..230fffa 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -753,31 +753,18 @@ Assumes the tags table is the current buffer."
(setq tags-included-tables (funcall
tags-included-tables-function))))
(defun tags-completion-table ()
- "Build `tags-completion-table' on demand.
+ "Return tags completion table.
The tags included in the completion table are those in the current
tags table and its (recursively) included tags tables."
- (or tags-completion-table
- ;; No cached value for this buffer.
- (condition-case ()
- (let (current-table combined-table)
- (message "Making tags completion table for %s..." buffer-file-name)
- (save-excursion
- ;; Iterate over the current list of tags tables.
- (while (visit-tags-table-buffer (and combined-table t))
- ;; Find possible completions in this table.
- (setq current-table (funcall tags-completion-table-function))
- ;; Merge this buffer's completions into the combined table.
- (if combined-table
- (mapatoms
- (lambda (sym) (intern (symbol-name sym) combined-table))
- current-table)
- (setq combined-table current-table))))
- (message "Making tags completion table for %s...done"
- buffer-file-name)
- ;; Cache the result in a buffer-local variable.
- (setq tags-completion-table combined-table))
- (quit (message "Tags completion table construction aborted.")
- (setq tags-completion-table nil)))))
+ (completion-table-with-cache
+ (lambda (string)
+ (let (cont tables)
+ (save-excursion
+ ;; Iterate over the current list of tags tables.
+ (while (visit-tags-table-buffer (or cont (progn (setq cont t)
nil)))
+ ;; Find possible completions in this table.
+ (push (funcall tags-completion-table-function string) tables)))
+ (nreverse (apply #'nconc tables))))))
;;;###autoload
(defun tags-lazy-completion-table ()
@@ -1218,7 +1205,7 @@ buffer-local values of tags table format variables."
(mapc (lambda (elt) (set (make-local-variable (car elt)) (cdr
elt)))
'((file-of-tag-function . etags-file-of-tag)
(tags-table-files-function . etags-tags-table-files)
- (tags-completion-table-function . etags-tags-completion-table)
+ (tags-completion-table-function . etags-tags-completions)
(snarf-tag-function . etags-snarf-tag)
(goto-tag-location-function . etags-goto-tag-location)
(find-tag-regexp-search-function . re-search-forward)
@@ -1255,12 +1242,9 @@ buffer-local values of tags table format variables."
(expand-file-name str (file-truename default-directory))))))
-(defun etags-tags-completion-table () ; Doc string?
- (let ((table (make-vector 511 0))
- (progress-reporter
- (make-progress-reporter
- (format "Making tags completion table for %s..." buffer-file-name)
- (point-min) (point-max))))
+(defun etags-tags-completions (string) ; Doc string?
+ (let ((table nil)
+ (re (format "[\n \t()=,;\177]%s" (regexp-quote string))))
(save-excursion
(goto-char (point-min))
;; This monster regexp matches an etags tag line.
@@ -1271,18 +1255,16 @@ buffer-local values of tags table format variables."
;; \5 is the explicitly-specified tag name.
;; \6 is the line to start searching at;
;; \7 is the char to start searching at.
- (while (re-search-forward
- "^\\(\\([^\177]+[^-a-zA-Z0-9_+*$:\177]+\\)?\
-\\([-a-zA-Z0-9_+*$?:]+\\)[^-a-zA-Z0-9_+*$?:\177]*\\)\177\
-\\(\\([^\n\001]+\\)\001\\)?\\([0-9]+\\)?,\\([0-9]+\\)?\n"
- nil t)
- (intern (prog1 (if (match-beginning 5)
- ;; There is an explicit tag name.
- (buffer-substring (match-beginning 5) (match-end 5))
- ;; No explicit tag name. Best guess.
- (buffer-substring (match-beginning 3) (match-end 3)))
- (progress-reporter-update progress-reporter (point)))
- table)))
+ (while (re-search-forward re nil t)
+ (save-excursion
+ (goto-char (match-beginning 0))
+ (let ((match-re (if (eq (char-after) ?\177)
+ ;; Explicit tag name.
+ "\177\\([^\001]+\\)\001"
+ ;; Implicit tag name.
+ "[\n \t()=,;]\\([^\177 \t()=,;]+\\)\177")))
+ (when (looking-at match-re)
+ (push (match-string 1) table))))))
table))
(defun etags-snarf-tag (&optional use-explicit) ; Doc string?
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., (continued)
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/23
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/25
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/25
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/25
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/26
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/26
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/26
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/26
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Stefan Monnier, 2015/05/26
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/28
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files.,
Dmitry Gutov <=
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/26
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/27
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/27
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/27
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/27
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/27
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/27
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/27
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Dmitry Gutov, 2015/05/28
- bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files., Eli Zaretskii, 2015/05/28