summaryrefslogtreecommitdiff
path: root/lisp/cedet/semantic/bovine
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2009-10-21 14:04:00 +0000
committerChong Yidong <cyd@stupidchicken.com>2009-10-21 14:04:00 +0000
commit8d106ea001f5a258da2a36a70587cc8fc9695b1c (patch)
tree5d15a723f963ef7c5b9909508139c247fe03fecf /lisp/cedet/semantic/bovine
parentfc754ea1a40ae58dba2dbd4a9e9e11bb04f71a38 (diff)
downloademacs-8d106ea001f5a258da2a36a70587cc8fc9695b1c.tar.gz
* 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.
Diffstat (limited to 'lisp/cedet/semantic/bovine')
-rw-r--r--lisp/cedet/semantic/bovine/c.el68
1 files changed, 55 insertions, 13 deletions
diff --git a/lisp/cedet/semantic/bovine/c.el b/lisp/cedet/semantic/bovine/c.el
index 8a773583aee..de7ed48edfd 100644
--- a/lisp/cedet/semantic/bovine/c.el
+++ b/lisp/cedet/semantic/bovine/c.el
@@ -712,19 +712,26 @@ the regular parser."
;; Protect against user hooks throwing errors.
(condition-case nil
(funcall mode)
- (error nil))
-
- ;; 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)
- ))
+ (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)
+ )
;; Get the macro symbol table right.
(setq semantic-lex-spp-dynamic-macro-symbol-obarray spp-syms)
;; (message "%S" macros)
@@ -751,6 +758,41 @@ the regular parser."
)
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)