]> git.eshelyaron.com Git - emacs.git/commitdiff
* cedet/semantic/bovine/c.el (semantic-c-debug-mode-init)
authorChong Yidong <cyd@stupidchicken.com>
Wed, 21 Oct 2009 14:04:00 +0000 (14:04 +0000)
committerChong Yidong <cyd@stupidchicken.com>
Wed, 21 Oct 2009 14:04:00 +0000 (14:04 +0000)
(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.

lisp/ChangeLog
lisp/cedet/semantic/bovine/c.el
lisp/cedet/semantic/lex-spp.el

index 4aaaee7a2b1767b0187fb6abcff4a6100de38536..e78a3c28ee19debb9b2e0a2cf3c4efcaf10b7439 100644 (file)
@@ -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.
index 8a773583aee50411920df8a7887f7eeedeaf9660..de7ed48edfd267b58184a0e65fa86c037ef79bd6 100644 (file)
@@ -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)
index 03b54ab624042b8e3eb36dd9a44a951ad3707dac..b078a25b28e2c3a1226979e986076f25e8476afc 100644 (file)
@@ -697,7 +697,14 @@ Argument BEG and END specify the bounds of SYM in the buffer."
          (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))