unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Dmitry Gutov <dgutov@yandex.ru>
To: Stefan Monnier <monnier@IRO.UMontreal.CA>, Eli Zaretskii <eliz@gnu.org>
Cc: 20629@debbugs.gnu.org
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	[thread overview]
Message-ID: <55671128.3080607@yandex.ru> (raw)
In-Reply-To: <55670209.9080608@yandex.ru>

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))))
  \f
  (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?






  reply	other threads:[~2015-05-28 12:59 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-22  5:57 bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files Jan D.
2015-05-23 11:54 ` Jan Djärv
2015-05-23 12:04   ` Dmitry Gutov
2015-05-23 12:15     ` Jan Djärv
2015-05-23 12:18       ` Dmitry Gutov
2015-05-23 12:28         ` Jan Djärv
2015-05-23 12:39           ` Dmitry Gutov
2015-05-23 13:51           ` Eli Zaretskii
2015-05-23 13:50       ` Eli Zaretskii
2015-05-23 14:46         ` Eli Zaretskii
2015-05-23 15:56           ` Eli Zaretskii
2015-05-25 15:15             ` Eli Zaretskii
2015-05-25 21:17               ` Dmitry Gutov
2015-05-26  2:35                 ` Eli Zaretskii
2015-05-26 10:16                   ` Dmitry Gutov
2015-05-26 15:06                     ` Eli Zaretskii
2015-05-26 19:00                       ` Dmitry Gutov
2015-05-26 19:23                         ` Eli Zaretskii
2015-05-26 21:01                           ` Stefan Monnier
2015-05-28 11:54                             ` Dmitry Gutov
2015-05-28 12:59                               ` Dmitry Gutov [this message]
2015-05-26 23:56                           ` Dmitry Gutov
2015-05-27 14:28                             ` Eli Zaretskii
2015-05-27 15:28                               ` Dmitry Gutov
2015-05-27 15:46                                 ` Eli Zaretskii
2015-05-27 15:54                                   ` Dmitry Gutov
2015-05-27 16:23                                     ` Eli Zaretskii
2015-05-27 23:50                                       ` Dmitry Gutov
2015-05-28  2:50                                         ` Eli Zaretskii
2015-05-28 10:22                                           ` Dmitry Gutov
2015-05-28 14:56                                             ` Eli Zaretskii
2015-05-28 15:32                                               ` Dmitry Gutov
2015-05-28 16:34                                                 ` Eli Zaretskii
2015-05-29  0:09                                                   ` Dmitry Gutov
2015-05-29  6:48                                                     ` Glenn Morris
2015-05-29  8:09                                                       ` Eli Zaretskii
2015-05-29 12:34                                                         ` Francesco Potortì
2015-05-29  9:27                                                       ` Dmitry Gutov
2015-05-29  8:12                                                     ` Eli Zaretskii
2015-05-29 14:05                                                       ` Dmitry Gutov
2015-05-29 16:51                                                         ` Stefan Monnier
2015-05-29 17:12                                                           ` Dmitry Gutov
2015-05-29 19:19                                                             ` Stefan Monnier
2015-05-29 20:33                                                               ` Dmitry Gutov
2015-05-29 18:28                                                         ` Eli Zaretskii
2015-05-29 20:01                                                           ` Dmitry Gutov
2015-05-29 20:35                                                             ` Eli Zaretskii
2015-05-29 22:36                                                               ` Dmitry Gutov
2015-05-30  6:52                                                                 ` Eli Zaretskii
2015-05-30 12:52                                                                   ` Dmitry Gutov
2015-05-30 13:03                                                                     ` Eli Zaretskii
2015-05-30 14:21                                                                     ` Francesco Potortì
2015-05-30 14:44                                                                       ` Dmitry Gutov
2015-05-28 11:35                                   ` Francesco Potortì
2015-05-28 11:46                                     ` Dmitry Gutov
2015-05-28 12:16                                       ` Francesco Potortì
2015-05-28 13:00                                         ` Dmitry Gutov
2015-05-28 13:12                                           ` Francesco Potortì
2015-05-28 15:04                                             ` Eli Zaretskii
2015-05-28 15:14                                               ` Francesco Potortì
2015-05-28 15:29                                                 ` Francesco Potortì
2015-05-29 17:13                                                 ` Dmitry Gutov
2015-05-30 12:06                             ` Eli Zaretskii
2015-05-30 12:30                               ` Dmitry Gutov
2015-05-30 12:46                                 ` Eli Zaretskii
2015-05-30 13:42                                   ` Dmitry Gutov
2015-05-30 14:31                                     ` Eli Zaretskii
2015-05-30 15:03                                       ` Dmitry Gutov
2015-05-30 16:37                                         ` Eli Zaretskii
2015-05-30 17:46                                           ` Dmitry Gutov
2015-05-30 18:46                                             ` Eli Zaretskii
2015-05-30 19:42                                               ` Dmitry Gutov
2015-11-26  3:23                                                 ` Dmitry Gutov
2015-11-26 15:43                                                   ` Eli Zaretskii
2015-11-26 16:12                                                     ` Dmitry Gutov
2015-11-26 16:32                                                       ` Eli Zaretskii
2015-11-27  3:54                                                         ` Dmitry Gutov
2016-03-19 18:45                                                           ` Eli Zaretskii
2015-05-30 17:01                                       ` Francesco Potortì
2015-05-30 18:13                                         ` Dmitry Gutov
2015-05-30 18:42                                           ` Eli Zaretskii
2015-05-30 19:35                                           ` Francesco Potortì
2015-05-30 20:04                                             ` Dmitry Gutov
2015-05-30 22:35                                               ` Francesco Potortì
2015-05-31  0:34                                                 ` Dmitry Gutov
2015-05-31 21:46 ` bug#20629: Fwd: bug#20703: 24.4; Stack overflow in regexp matcher Francesco Potortì
2015-05-31 22:20   ` Dmitry Gutov
2015-05-31 22:40     ` Francesco Potortì

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55671128.3080607@yandex.ru \
    --to=dgutov@yandex.ru \
    --cc=20629@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    --cc=monnier@IRO.UMontreal.CA \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).