Don't call c-parse-state when c++-template-syntax-table is active.
[bpt/emacs.git] / lisp / progmodes / cc-fonts.el
index ee5fb1b..bf5630d 100644 (file)
@@ -1,6 +1,6 @@
 ;;; cc-fonts.el --- font lock support for CC Mode
 
-;; Copyright (C) 2002-2012 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2014 Free Software Foundation, Inc.
 
 ;; Authors:    2003- Alan Mackenzie
 ;;             2002- Martin Stjernholm
       'font-lock-negation-char-face))
 
 (cc-bytecomp-defun face-inverse-video-p) ; Only in Emacs.
-(cc-bytecomp-defun face-property-instance) ; Only in XEmacs.
 
 (defun c-make-inverse-face (oldface newface)
   ;; Emacs and XEmacs have completely different face manipulation
              ;; `parse-sexp-lookup-properties' (when it exists).
              (parse-sexp-lookup-properties
               (cc-eval-when-compile
-                (boundp 'parse-sexp-lookup-properties))))
+                (boundp 'parse-sexp-lookup-properties)))
+             (BOD-limit
+              (c-determine-limit 1000)))
          (goto-char
           (let ((here (point)))
-            (if (eq (car (c-beginning-of-decl-1)) 'same)
+            (if (eq (car (c-beginning-of-decl-1 BOD-limit)) 'same)
                 (point)
               here)))
          ,(c-make-font-lock-search-form regexp highlights))
@@ -1240,6 +1241,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
          ;; it finds any.  That's necessary so that we later will
          ;; stop inside them to fontify types there.
          (c-parse-and-markup-<>-arglists t)
+         lbrace ; position of some {.
          ;; The font-lock package in Emacs is known to clobber
          ;; `parse-sexp-lookup-properties' (when it exists).
          (parse-sexp-lookup-properties
@@ -1305,7 +1307,8 @@ casts and declarations are fontified.  Used on level 2 and higher."
                            (goto-char match-pos)
                            (backward-char)
                            (c-backward-token-2)
-                           (looking-at c-block-stmt-2-key)))
+                           (or (looking-at c-block-stmt-2-key)
+                               (looking-at c-block-stmt-1-2-key))))
                     (setq context nil
                           c-restricted-<>-arglists t))
                    ;; Near BOB.
@@ -1351,7 +1354,6 @@ casts and declarations are fontified.  Used on level 2 and higher."
              (or (looking-at c-typedef-key)
                  (goto-char start-pos)))
 
-           ;; Now analyze the construct.
            ;; In QT, "more" is an irritating keyword that expands to nothing.
            ;; We skip over it to prevent recognition of "more slots: <symbol>"
            ;; as a bitfield declaration.
@@ -1360,6 +1362,8 @@ casts and declarations are fontified.  Used on level 2 and higher."
                        (concat "\\(more\\)\\([^" c-symbol-chars "]\\|$\\)")))
              (goto-char (match-end 1))
              (c-forward-syntactic-ws))
+
+           ;; Now analyze the construct.
            (setq decl-or-cast (c-forward-decl-or-cast-1
                                match-pos context last-cast-end))
 
@@ -1428,11 +1432,56 @@ casts and declarations are fontified.  Used on level 2 and higher."
              (c-fontify-recorded-types-and-refs)
              nil)
 
+            ;; Restore point, since at this point in the code it has been
+            ;; left undefined by c-forward-decl-or-cast-1 above.
+            ((progn (goto-char start-pos) nil))
+
+            ;; If point is inside a bracelist, there's no point checking it
+            ;; being at a declarator.
+            ((let ((paren-state (c-parse-state)))
+               (setq lbrace (c-cheap-inside-bracelist-p paren-state)))
+             ;; Move past this bracelist to prevent an endless loop.
+             (goto-char lbrace)
+             (unless (c-safe (progn (forward-list) t))
+               (goto-char start-pos)
+               (c-forward-token-2))
+             nil)
+
+            ;; If point is just after a ")" which is followed by an
+            ;; identifier which isn't a label, or at the matching "(", we're
+            ;; at either a macro invocation, a cast, or a
+            ;; for/while/etc. statement.  The cast case is handled above.
+            ;; None of these cases can contain a declarator.
+            ((or (and (eq (char-before match-pos) ?\))
+                      (c-on-identifier)
+                      (save-excursion (not (c-forward-label))))
+                 (and (eq (char-after) ?\()
+                      (save-excursion
+                        (and
+                         (progn (c-backward-token-2) (c-on-identifier))
+                         (save-excursion (not (c-forward-label)))
+                         (progn (c-backward-token-2)
+                                (eq (char-after) ?\())))))
+             (c-forward-token-2)       ; Must prevent looping.
+             nil)
+
+            ((and (not c-enums-contain-decls)
+                  ;; An optimization quickly to eliminate scans of long enum
+                  ;; declarations in the next cond arm.
+                  (let ((paren-state (c-parse-state)))
+                    (and
+                     (numberp (car paren-state))
+                     (save-excursion
+                       (goto-char (car paren-state))
+                       (c-backward-over-enum-header)))))
+             (c-forward-token-2)
+             nil)
+
             (t
              ;; Are we at a declarator?  Try to go back to the declaration
              ;; to check this.  If we get there, check whether a "typedef"
              ;; is there, then fontify the declarators accordingly.
-             (let ((decl-search-lim (max (- (point) 50000) (point-min)))
+             (let ((decl-search-lim (c-determine-limit 1000))
                    paren-state bod-res encl-pos is-typedef
                    c-recognize-knr-p) ; Strictly speaking, bogus, but it
                                       ; speeds up lisp.h tremendously.
@@ -1514,12 +1563,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
           (eq (char-after encl-pos) ?\{)
           (save-excursion
             (goto-char encl-pos)
-            (c-backward-syntactic-ws)
-            (c-simple-skip-symbol-backward)
-            (or (looking-at c-brace-list-key) ; "enum"
-                (progn (c-backward-syntactic-ws)
-                       (c-simple-skip-symbol-backward)
-                       (looking-at c-brace-list-key)))))
+            (c-backward-over-enum-header)))
       (c-syntactic-skip-backward "^{," nil t)
       (c-put-char-property (1- (point)) 'c-type 'c-decl-id-start)
 
@@ -1538,6 +1582,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
   ;; prevent a repeat invocation.  See elisp/lispref page "Search-based
   ;; Fontification".
   (let* ((paren-state (c-parse-state))
+        (decl-search-lim (c-determine-limit 1000))
         decl-context in-typedef ps-elt)
     ;; Are we in any nested struct/union/class/etc. braces?
     (while paren-state
@@ -1546,7 +1591,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
       (when (and (atom ps-elt)
                 (eq (char-after ps-elt) ?\{))
        (goto-char ps-elt)
-       (setq decl-context (c-beginning-of-decl-1)
+       (setq decl-context (c-beginning-of-decl-1 decl-search-lim)
              in-typedef (looking-at c-typedef-key))
        (if in-typedef (c-forward-token-2))
        (when (and c-opt-block-decls-with-vars-key
@@ -1839,7 +1884,7 @@ higher."
                "\\)\\>"
                ;; Disallow various common punctuation chars that can't come
                ;; before the '{' of the enum list, to avoid searching too far.
-               "[^\]\[{}();,/#=]*"
+               "[^\]\[{}();/#=]*"
                "{")
               '((c-font-lock-declarators limit t nil)
                 (save-match-data
@@ -1995,7 +2040,7 @@ styles specified by `c-doc-comment-style'.")
 
 (defconst c-font-lock-keywords-3 (c-lang-const c-matchers-3 c)
   "Accurate normal font locking for C mode.
-Like `c-font-lock-keywords-2' but detects declarations in a more
+Like the variable `c-font-lock-keywords-2' but detects declarations in a more
 accurate way that works in most cases for arbitrary types without the
 need for `c-font-lock-extra-types'.")
 
@@ -2153,7 +2198,7 @@ styles specified by `c-doc-comment-style'.")
 
 (defconst c++-font-lock-keywords-3 (c-lang-const c-matchers-3 c++)
   "Accurate normal font locking for C++ mode.
-Like `c++-font-lock-keywords-2' but detects declarations in a more
+Like the variable `c++-font-lock-keywords-2' but detects declarations in a more
 accurate way that works in most cases for arbitrary types without the
 need for `c++-font-lock-extra-types'.")
 
@@ -2259,7 +2304,7 @@ comment styles specified by `c-doc-comment-style'.")
 
 (defconst objc-font-lock-keywords-3 (c-lang-const c-matchers-3 objc)
   "Accurate normal font locking for Objective-C mode.
-Like `objc-font-lock-keywords-2' but detects declarations in a more
+Like the variable `objc-font-lock-keywords-2' but detects declarations in a more
 accurate way that works in most cases for arbitrary types without the
 need for `objc-font-lock-extra-types'.")
 
@@ -2302,7 +2347,7 @@ comment styles specified by `c-doc-comment-style'.")
 
 (defconst java-font-lock-keywords-3 (c-lang-const c-matchers-3 java)
   "Accurate normal font locking for Java mode.
-Like `java-font-lock-keywords-2' but detects declarations in a more
+Like variable `java-font-lock-keywords-2' but detects declarations in a more
 accurate way that works in most cases for arbitrary types without the
 need for `java-font-lock-extra-types'.")
 
@@ -2335,7 +2380,7 @@ styles specified by `c-doc-comment-style'.")
 
 (defconst idl-font-lock-keywords-3 (c-lang-const c-matchers-3 idl)
   "Accurate normal font locking for CORBA IDL mode.
-Like `idl-font-lock-keywords-2' but detects declarations in a more
+Like the variable `idl-font-lock-keywords-2' but detects declarations in a more
 accurate way that works in most cases for arbitrary types without the
 need for `idl-font-lock-extra-types'.")
 
@@ -2368,7 +2413,7 @@ comment styles specified by `c-doc-comment-style'.")
 
 (defconst pike-font-lock-keywords-3 (c-lang-const c-matchers-3 pike)
   "Accurate normal font locking for Pike mode.
-Like `pike-font-lock-keywords-2' but detects declarations in a more
+Like the variable `pike-font-lock-keywords-2' but detects declarations in a more
 accurate way that works in most cases for arbitrary types without the
 need for `pike-font-lock-extra-types'.")
 
@@ -2432,7 +2477,7 @@ need for `pike-font-lock-extra-types'.")
              (setq comment-beg nil))
            (setq region-beg comment-beg))
 
-      (if (eq (elt (parse-partial-sexp comment-beg (+ comment-beg 2)) 7) t)
+      (if (elt (parse-partial-sexp comment-beg (+ comment-beg 2)) 7)
          ;; Collect a sequence of doc style line comments.
          (progn
            (goto-char comment-beg)