changeset 105692:15b4b661ceb1

* cedet/semantic/bovine/c.el (semantic-c-debug-mode-init) (semantic-c-debug-mode-init-pch): New functions. (semantic-c-debug-mode-init-last-mode): New var. (semantic-c-parse-lexical-token): Use them. * cedet/semantic/lex-spp.el (semantic-lex-spp-anlyzer-do-replace): When extracting the argument list, limit only by point-max.
author Chong Yidong <cyd@stupidchicken.com>
date Wed, 21 Oct 2009 14:04:00 +0000
parents ed970ee2fe76
children 964ff7cbc8a6
files lisp/ChangeLog lisp/cedet/semantic/bovine/c.el lisp/cedet/semantic/lex-spp.el
diffstat 3 files changed, 72 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Wed Oct 21 11:27:59 2009 +0000
+++ b/lisp/ChangeLog	Wed Oct 21 14:04:00 2009 +0000
@@ -1,3 +1,13 @@
+2009-10-21  Eric Ludlam  <zappo@gnu.org>
+
+	* cedet/semantic/bovine/c.el (semantic-c-debug-mode-init)
+	(semantic-c-debug-mode-init-pch): New functions.
+	(semantic-c-debug-mode-init-last-mode): New var.
+	(semantic-c-parse-lexical-token): Use them.
+
+	* cedet/semantic/lex-spp.el (semantic-lex-spp-anlyzer-do-replace):
+	When extracting the argument list, limit only by point-max.
+
 2009-10-21  Michael Albinus  <michael.albinus@gmx.de>
 
 	* net/tramp-smb.el (tramp-smb-get-stat-capability): New defun.
--- a/lisp/cedet/semantic/bovine/c.el	Wed Oct 21 11:27:59 2009 +0000
+++ b/lisp/cedet/semantic/bovine/c.el	Wed Oct 21 14:04:00 2009 +0000
@@ -712,19 +712,26 @@
 	  ;; Protect against user hooks throwing errors.
 	  (condition-case nil
 	      (funcall mode)
-	    (error nil))
+	    (error
+	     (if (y-or-n-p
+		  (format "There was an error initializing %s in buffer \"%s\". Debug your hooks? "
+			  mode (buffer-name)))
+		 (semantic-c-debug-mode-init mode)
+	       (message "Macro parsing state may be broken...")
+	       (sit-for 1))))
+	  ) ; save match data
 
-	  ;; Hack in mode-local
-	  (activate-mode-local-bindings)
-	  ;; CHEATER!  The following 3 lines are from
-	  ;; `semantic-new-buffer-fcn', but we don't want to turn
-	  ;; on all the other annoying modes for this little task.
-	  (setq semantic-new-buffer-fcn-was-run t)
-	  (semantic-lex-init)
-	  (semantic-clear-toplevel-cache)
-	  (remove-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook
-		       t)
-	  ))
+	;; Hack in mode-local
+	(activate-mode-local-bindings)
+	;; CHEATER!  The following 3 lines are from
+	;; `semantic-new-buffer-fcn', but we don't want to turn
+	;; on all the other annoying modes for this little task.
+	(setq semantic-new-buffer-fcn-was-run t)
+	(semantic-lex-init)
+	(semantic-clear-toplevel-cache)
+	(remove-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook
+		     t)
+	)
       ;; Get the macro symbol table right.
       (setq semantic-lex-spp-dynamic-macro-symbol-obarray spp-syms)
       ;; (message "%S" macros)
@@ -751,6 +758,41 @@
       )
     stream))
 
+(defvar semantic-c-debug-mode-init-last-mode nil
+  "The most recent mode needing debugging.")
+
+(defun semantic-c-debug-mode-init (mm)
+  "Debug mode init for major mode MM after we're done parsing now."
+  (interactive (list semantic-c-debug-mode-init-last-mode))
+  (if (interactive-p)
+      ;; Do the debug.
+      (progn
+	(switch-to-buffer (get-buffer-create "*MODE HACK TEST*"))
+	(let ((debug-on-error t))
+	  (funcall mm)))
+
+    ;; Notify about the debug
+    (setq semantic-c-debug-mode-init-last-mode mm)
+
+    (add-hook 'post-command-hook 'semantic-c-debug-mode-init-pch)))
+
+(defun semantic-c-debug-mode-init-pch ()
+  "Notify user about needing to debug their major mode hooks."
+  (let ((mm semantic-c-debug-mode-init-last-mode))
+    (switch-to-buffer-other-window
+     (get-buffer-create "*MODE HACK TEST*"))
+    (erase-buffer)
+    (insert "A failure occured while parsing your buffers.
+
+The failure occured while attempting to initialize " (symbol-name mm) " in a
+buffer not associated with a file.  To debug this problem, type
+
+M-x semantic-c-debug-mode-init
+
+now.
+")
+    (remove-hook 'post-command-hook 'semantic-c-debug-mode-init-pch)))
+
 (defun semantic-expand-c-tag (tag)
   "Expand TAG into a list of equivalent tags, or nil."
   (let ((return-list nil)
--- a/lisp/cedet/semantic/lex-spp.el	Wed Oct 21 11:27:59 2009 +0000
+++ b/lisp/cedet/semantic/lex-spp.el	Wed Oct 21 14:04:00 2009 +0000
@@ -697,7 +697,14 @@
 	  (goto-char end)
 	  (setq arg-parsed
 		(semantic-lex-spp-one-token-and-move-for-macro
-		 (point-at-eol)))
+		 ;; NOTE: This used to be (point-at-eol), but
+		 ;;       that was too close for multi-line arguments
+		 ;;       to a macro.  Point max may be too far if there
+		 ;;       is a typo in the buffer.
+		 ;;
+		 ;; Look here for performance issues while a user is typing
+		 ;; incomplete code.
+		 (point-max)))
 	  (setq end (semantic-lex-token-end arg-parsed))
 
 	  (when (and (listp arg-parsed) (eq (car arg-parsed) 'semantic-list))