]> code.delx.au - gnu-emacs/blobdiff - lisp/progmodes/cc-fonts.el
Merge from emacs-24; up to 2012-12-17T11:17:34Z!rgm@gnu.org
[gnu-emacs] / lisp / progmodes / cc-fonts.el
index bca95c97e8b1458d5b9ea0f10dd8ee4ea1a11e58..f6c47f5bb4d3d1a28d3acab623c71e4e25b06bc7 100644 (file)
@@ -1,6 +1,6 @@
 ;;; cc-fonts.el --- font lock support for CC Mode
 
-;; Copyright (C) 2002-2011 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2013 Free Software Foundation, Inc.
 
 ;; Authors:    2003- Alan Mackenzie
 ;;             2002- Martin Stjernholm
         (unless (face-property-instance oldface 'reverse)
           (invert-face newface)))))
 
-(defvar c-annotation-face (make-face 'c-annotation-face)
-  "Face used to highlight annotations in java-mode and other modes that may wish to use it.")
-(set-face-foreground 'c-annotation-face "blue")
+(defvar c-annotation-face 'c-annotation-face)
+
+(defface c-annotation-face
+  '((default :inherit font-lock-constant-face))
+  "Face for highlighting annotations in Java mode and similar modes."
+  :version "24.1"
+  :group 'c)
 
 (eval-and-compile
   ;; We need the following definitions during compilation since they're
   ;; from within a #if preprocessor construct.
   (defvar c-font-lock-context nil)
   (make-variable-buffer-local 'c-font-lock-context)
-  
+
   (defmacro c-put-font-lock-face (from to face)
     ;; Put a face on a region (overriding any existing face) in the way
     ;; font-lock would do it.  In XEmacs that means putting an
          res))))
 
   (defun c-make-font-lock-search-form (regexp highlights)
-    ;; Return a lisp form which will fontify every occurence of REGEXP
+    ;; Return a lisp form which will fontify every occurrence of REGEXP
     ;; (a regular expression, NOT a function) between POINT and `limit'
     ;; with HIGHLIGHTS, a list of highlighters as specified on page
     ;; "Search-based Fontification" in the elisp manual.
                        (match-beginning ,(car highlight))
                        (match-end ,(car highlight))
                        ,(elt highlight 1))))
-               ;; highlight is an "ANCHORED HIGHLIGHER" of the form
+               ;; highlight is an "ANCHORED HIGHLIGHTER" of the form
                ;; (ANCHORED-MATCHER PRE-FORM POST-FORM SUBEXP-HIGHLIGHTERS...)
                (when (nth 3 highlight)
                  (error "Match highlights currently not supported in %s"
     ;; establish a context for the current text when, e.g., a character
     ;; is typed on a C++ inheritance continuation line, or a jit-lock
     ;; chunk starts there.
-    ;; 
+    ;;
     ;; The new function works much like a matcher element in
     ;; `font-lock-keywords'.  It cuts out a little bit of the overhead
     ;; compared to a real matcher.  The main reason is however to pass the
              ;; `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))
     ;; This function does not do any hidden buffer changes, but the
     ;; generated functions will.  (They are however used in places
     ;; covered by the font-lock context.)
-    ;; 
+    ;;
     ;; Note: Replace `byte-compile' with `eval' to debug the generated
     ;; lambda more easily.
     (byte-compile
@@ -1040,7 +1046,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
        ;; Inside the following "condition form", we move forward over the
        ;; declarator's identifier up as far as any opening bracket (for array
        ;; size) or paren (for parameters of function-type) or brace (for
-       ;; array/struct initialisation) or "=" or terminating delimiter
+       ;; array/struct initialization) or "=" or terminating delimiter
        ;; (e.g. "," or ";" or "}").
        (and
            pos
@@ -1103,7 +1109,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
              (<= (point) limit))
 
            ;; Search syntactically to the end of the declarator (";",
-           ;; ",", a closen paren, eob etc) or to the beginning of an
+           ;; ",", a closing paren, eob etc) or to the beginning of an
            ;; initializer or function prototype ("=" or "\\s\(").
            ;; Note that the open paren will match array specs in
            ;; square brackets, and we treat them as initializers too.
@@ -1122,7 +1128,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
                          (char-after (match-beginning 1))))
 
       (if types
-         ;; Register and fontify the identifer as a type.
+         ;; Register and fontify the identifier as a type.
          (let ((c-promote-possible-types t))
            (goto-char id-start)
            (c-forward-type))
@@ -1207,7 +1213,7 @@ casts and declarations are fontified.  Used on level 2 and higher."
          ;; o - '<> if the arglist is of angle bracket type;
          ;; o - 'arglist if it's some other arglist;
          ;; o - nil, if not in an arglist at all.  This includes the
-         ;;   parenthesised condition which follows "if", "while", etc.
+         ;;   parenthesized condition which follows "if", "while", etc.
          context
          ;; The position of the next token after the closing paren of
          ;; the last detected cast.
@@ -1236,6 +1242,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
@@ -1277,9 +1284,11 @@ casts and declarations are fontified.  Used on level 2 and higher."
         (when
          ;; The result of the form below is true when we don't recognize a
          ;; declaration or cast.
-         (if (and (eq (get-text-property (point) 'face)
-                      'font-lock-keyword-face)
-                  (looking-at c-not-decl-init-keywords))
+         (if (or (and (eq (get-text-property (point) 'face)
+                          'font-lock-keyword-face)
+                      (looking-at c-not-decl-init-keywords))
+                 (and c-macro-with-semi-re
+                      (looking-at c-macro-with-semi-re))) ; 2008-11-04
              ;; Don't do anything more if we're looking at a keyword that
              ;; can't start a declaration.
              t
@@ -1345,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.
@@ -1354,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))
 
@@ -1422,12 +1432,61 @@ 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-token-2)
+                       (or (looking-at c-brace-list-key)
+                           (progn
+                             (c-backward-token-2)
+                             (looking-at c-brace-list-key)))))))
+             (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)))
-                   paren-state bod-res encl-pos is-typedef 
+             (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.
                (save-excursion
@@ -1525,46 +1584,32 @@ casts and declarations are fontified.  Used on level 2 and higher."
   ;; Fontify the declarators of (nested) declarations we're in the middle of.
   ;; This is mainly for when a jit-lock etc. chunk starts inside the brace
   ;; block of a struct/union/class, etc.
-  ;; 
+  ;;
   ;; This function will be called from font-lock for a region bounded by POINT
   ;; and LIMIT, as though it were to identify a keyword for
   ;; font-lock-keyword-face.  It always returns NIL to inhibit this and
   ;; prevent a repeat invocation.  See elisp/lispref page "Search-based
   ;; Fontification".
   (let* ((paren-state (c-parse-state))
-        (start (point))
-        decl-context bo-decl in-typedef type-type ps-elt)
-
-    ;; First, are we actually in a "local" declaration?
-    (setq decl-context (c-beginning-of-decl-1)
-         bo-decl (point)
-         in-typedef (looking-at c-typedef-key))
-    (if in-typedef (c-forward-token-2))
-    (when (and (eq (car decl-context) 'same)
-              (< bo-decl start))
-      ;; Are we genuinely at a type?
-      (setq type-type (c-forward-type t))
-      (if (and type-type
-              (or (not (eq type-type 'maybe))
-                  (looking-at c-symbol-key)))
-         (c-font-lock-declarators limit t in-typedef)))
-
-    ;; Secondly, are we in any nested struct/union/class/etc. braces?
+        (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
       (setq ps-elt (car paren-state)
            paren-state (cdr paren-state))
       (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 (looking-at c-opt-block-decls-with-vars-key)
+       (when (and c-opt-block-decls-with-vars-key
+                  (looking-at c-opt-block-decls-with-vars-key))
          (goto-char ps-elt)
          (when (c-safe (c-forward-sexp))
            (c-forward-syntactic-ws)
            (c-font-lock-declarators limit t in-typedef)))))))
-       
+
 (c-lang-defconst c-simple-decl-matchers
   "Simple font lock matchers for types and declarations.  These are used
 on level 2 only and so aren't combined with `c-complex-decl-matchers'."
@@ -2004,7 +2049,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'.")
 
@@ -2162,7 +2207,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'.")
 
@@ -2268,7 +2313,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'.")
 
@@ -2311,7 +2356,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'.")
 
@@ -2344,7 +2389,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'.")
 
@@ -2377,7 +2422,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'.")
 
@@ -2512,7 +2557,7 @@ need for `pike-font-lock-extra-types'.")
 (defconst gtkdoc-font-lock-doc-comments
   (let ((symbol "[a-zA-Z0-9_]+")
        (header "^ \\* "))
-    `((,(concat header "\\("     symbol "\\):[ \t]*$") 
+    `((,(concat header "\\("     symbol "\\):[ \t]*$")
        1 ,c-doc-markup-face-name prepend nil)
       (,(concat                  symbol     "()")
        0 ,c-doc-markup-face-name prepend nil)