emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master c99a3b9: Speed up project-find-regexp for simple re


From: Dmitry Gutov
Subject: [Emacs-diffs] master c99a3b9: Speed up project-find-regexp for simple regexps
Date: Mon, 1 May 2017 17:15:12 -0400 (EDT)

branch: master
commit c99a3b90a010448c14475666cb78f05860b0e1c2
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    Speed up project-find-regexp for simple regexps
    
    * lisp/progmodes/xref.el (xref--regexp-syntax-dependent-p):
    New function.
    (xref--collect-matches): Use it.  Don't try to enable the
    appropriate major mode and file-local variables if the regexp
    does not depend on the buffer's syntax (bug#26710).
    (xref--collect-matches-1): Don't syntax-propertize in that
    case either.
---
 lisp/progmodes/xref.el | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index d0636ba..c9df450 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1004,6 +1004,17 @@ directory, used as the root of the ignore globs."
                (match-string 1 str)))))
    str t t))
 
+(defun xref--regexp-syntax-dependent-p (str)
+  "Return non-nil when STR depends on the buffer's syntax.
+Such as the current syntax table and the applied syntax properties."
+  (let ((case-fold-search nil))
+    (string-match-p (rx
+                     (or string-start (not (in ?\\)))
+                     (0+ (= 2 ?\\))
+                     ?\\
+                     (in ?b ?B ?< ?> ?w ?W ?_ ?s ?S))
+                    str)))
+
 (defvar xref--last-visiting-buffer nil)
 (defvar xref--temp-buffer-file-name nil)
 
@@ -1017,7 +1028,8 @@ directory, used as the root of the ignore globs."
 
 (defun xref--collect-matches (hit regexp tmp-buffer)
   (pcase-let* ((`(,line ,file ,text) hit)
-               (buf (xref--find-buffer-visiting file)))
+               (buf (xref--find-buffer-visiting file))
+               (syntax-needed (xref--regexp-syntax-dependent-p regexp)))
     (if buf
         (with-current-buffer buf
           (save-excursion
@@ -1025,12 +1037,14 @@ directory, used as the root of the ignore globs."
             (forward-line (1- line))
             (xref--collect-matches-1 regexp file line
                                      (line-beginning-position)
-                                     (line-end-position))))
+                                     (line-end-position)
+                                     syntax-needed)))
       ;; Using the temporary buffer is both a performance and a buffer
       ;; management optimization.
       (with-current-buffer tmp-buffer
         (erase-buffer)
-        (unless (equal file xref--temp-buffer-file-name)
+        (when (and syntax-needed
+                   (not (equal file xref--temp-buffer-file-name)))
           (insert-file-contents file nil 0 200)
           ;; Can't (setq-local delay-mode-hooks t) because of
           ;; bug#23272, but the performance penalty seems minimal.
@@ -1046,11 +1060,13 @@ directory, used as the root of the ignore globs."
         (goto-char (point-min))
         (xref--collect-matches-1 regexp file line
                                  (point)
-                                 (point-max))))))
+                                 (point-max)
+                                 syntax-needed)))))
 
-(defun xref--collect-matches-1 (regexp file line line-beg line-end)
+(defun xref--collect-matches-1 (regexp file line line-beg line-end 
syntax-needed)
   (let (matches)
-    (syntax-propertize line-end)
+    (when syntax-needed
+      (syntax-propertize line-end))
     ;; FIXME: This results in several lines with the same
     ;; summary. Solve with composite pattern?
     (while (and



reply via email to

[Prev in Thread] Current Thread [Next in Thread]