changeset 58489:5df4ac03694d

Don't always require newcomment. (imenu--generic-function): Call comment-normalize-vars if we have a comment syntax. Exit the loop if REGEXP matches the null string. Test comment-start as well as comment-start-skip when deciding whether to check for comments.
author Richard M. Stallman <rms@gnu.org>
date Thu, 25 Nov 2004 02:57:47 +0000
parents 02e7f3437fea
children 2176686c8a19
files lisp/imenu.el
diffstat 1 files changed, 12 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/imenu.el	Thu Nov 25 02:55:37 2004 +0000
+++ b/lisp/imenu.el	Thu Nov 25 02:57:47 2004 +0000
@@ -62,8 +62,6 @@
 
 ;;; Code:
 
-(require 'newcomment)
-
 (eval-when-compile (require 'cl))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -745,8 +743,8 @@
 ;;;###autoload
 (make-variable-buffer-local 'imenu-case-fold-search)
 
-;; Originally "Built on some ideas that Erik Naggum <erik@naggum.no>
-;; once posted to comp.emacs" but since substantially re-written.
+;; This function can be called with quitting disabled,
+;; so it needs to be careful never to loop!
 (defun imenu--generic-function (patterns)
   "Return an index of the current buffer as an alist.
 
@@ -800,6 +798,9 @@
     (unwind-protect			; for syntax table
 	(save-match-data
 	  (set-syntax-table table)
+	  (if (or comment-start comment-start-skip)
+	      (comment-normalize-vars))
+
 	  ;; map over the elements of imenu-generic-expression
 	  ;; (typically functions, variables ...)
 	  (dolist (pat patterns)
@@ -812,12 +813,16 @@
 		  cs)
 	      ;; Go backwards for convenience of adding items in order.
 	      (goto-char (point-max))
-	      (while (re-search-backward regexp nil t)
+	      (while (and (re-search-backward regexp nil t)
+			  ;; Exit the loop if we get an empty match,
+			  ;; because it means a bad regexp was specified.
+			  (not (= (match-beginning 0) (match-end 0))))
 		(setq start (point))
 		(goto-char (match-end index))
 		(setq beg (match-beginning index))
-		(setq cs (and comment-start-skip
-			      (save-match-data (comment-beginning))))
+		(setq cs (and (or comment-start comment-start-skip)
+			      (save-match-data
+				(comment-beginning))))
 		(if cs
 		    (goto-char (min cs beg)) ; skip this one, it's in a comment
 		  (goto-char beg)