changeset 23163:e754d3dcb5e8

(tex-font-lock-keywords-2): Fontify \nocite like \cite. (lisp-font-lock-keywords-2): Fontify abort, assert, etc., separately. ({c,c++,objc,java}-font-lock-keywords-{2,3}): Fontify only type/class names with font-lock-type-face. Fontify type specs, etc., with font-lock-keyword-face.
author Simon Marshall <simon@gnu.org>
date Tue, 01 Sep 1998 09:01:44 +0000
parents b36799069143
children ecc4641bf00a
files lisp/font-lock.el
diffstat 1 files changed, 176 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/font-lock.el	Tue Sep 01 02:25:57 1998 +0000
+++ b/lisp/font-lock.el	Tue Sep 01 09:01:44 1998 +0000
@@ -236,7 +236,7 @@
 
 ;; User variables.
 
-(defcustom font-lock-maximum-size (* 250 1024)
+(defcustom font-lock-maximum-size 256000
   "*Maximum size of a buffer for buffer fontification.
 Only buffers less than this can be fontified when Font Lock mode is turned on.
 If nil, means size is irrelevant.
@@ -283,12 +283,12 @@
 				      (integer :tag "level" 1)))))
   :group 'font-lock)
 
-(defcustom font-lock-verbose (* 0 1024)
+(defcustom font-lock-verbose 0
   "*If non-nil, means show status messages for buffer fontification.
 If a number, only buffers greater than this size have fontification messages."
   :type '(choice (const :tag "never" nil)
-		 (integer :tag "size")
-		 (other :tag "always" t))
+		 (other :tag "always" t)
+		 (integer :tag "size"))
   :group 'font-lock)
 
 ;; Fontification variables:
@@ -1908,12 +1908,12 @@
      (list (concat "(\\(def\\("
 		   ;; Function declarations.
 		   "\\(advice\\|alias\\|generic\\|macro\\*?\\|method\\|"
-		   "setf\\|subst\\*?\\|un\\*?\\|"
-		   "ine-\\(derived-mode\\|function\\|condition\\|"
-		   "skeleton\\|widget\\|setf-expander\\|method-combination\\|"
-		   "\\(symbol\\|compiler\\|modify\\)-macro\\)\\)\\|"
+                   "setf\\|subst\\*?\\|un\\*?\\|"
+                   "ine-\\(condition\\|derived-mode\\|function\\|"
+                   "method-combination\\|setf-expander\\|skeleton\\|widget\\|"
+                   "\\(compiler\\|modify\\|symbol\\)-macro\\)\\)\\|"
 		   ;; Variable declarations.
-		   "\\(const\\(ant\\)?\\|custom\\|face\\|var\\|parameter\\)\\|"
+		   "\\(const\\(ant\\)?\\|custom\\|face\\|parameter\\|var\\)\\|"
 		   ;; Structure declarations.
 		   "\\(class\\|group\\|package\\|struct\\|type\\)"
 		   "\\)\\)\\>"
@@ -1939,14 +1939,14 @@
       ;; Control structures.  Emacs Lisp forms.
       (cons (concat
 	     "(" (regexp-opt
-		  '("cond" "if" "while" "catch" "throw" "let" "let*"
+		  '("cond" "if" "while" "let" "let*"
 		    "prog" "progn" "progv" "prog1" "prog2" "prog*"
-		    "inline" "save-restriction" "save-excursion"
+		    "inline" "lambda" "save-restriction" "save-excursion"
 		    "save-window-excursion" "save-selected-window"
 		    "save-match-data" "save-current-buffer" "unwind-protect"
 		    "condition-case" "track-mouse"
 		    "eval-after-load" "eval-and-compile" "eval-when-compile"
-		    "eval-when" "lambda"
+		    "eval-when"
 		    "with-current-buffer" "with-electric-help"
 		    "with-output-to-string" "with-output-to-temp-buffer"
 		    "with-temp-buffer" "with-temp-file"
@@ -1960,7 +1960,7 @@
 		  '("when" "unless" "case" "ecase" "typecase" "etypecase"
 		    "ccase" "ctypecase" "handler-case" "handler-bind"
 		    "restart-bind" "restart-case" "in-package"
-		    "assert" "abort" "error" "cerror" "break" "ignore-errors"
+		    "cerror" "break" "ignore-errors"
 		    "loop" "do" "do*" "dotimes" "dolist" "the" "locally"
 		    "proclaim" "declaim" "declare" "symbol-macrolet"
 		    "lexical-let" "lexical-let*" "flet" "labels" "compiler-let"
@@ -1969,9 +1969,14 @@
 	     "\\>")
 	    1)
       ;;
-      ;; Feature symbols as constants.
-      '("(\\(featurep\\|provide\\|require\\)\\>[ \t']*\\(\\sw+\\)?"
-	(1 font-lock-keyword-face) (2 font-lock-constant-face nil t))
+      ;; Exit/Feature symbols as constants.
+      (list (concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\>"
+		    "[ \t']*\\(\\sw+\\)?")
+	    '(1 font-lock-keyword-face)
+	    '(2 font-lock-constant-face nil t))
+      ;;
+      ;; Erroneous structures.
+      '("(\\(abort\\|assert\\|error\\|signal\\)\\>" 1 font-lock-warning-face)
       ;;
       ;; Words inside \\[] tend to be for `substitute-command-keys'.
       '("\\\\\\\\\\[\\(\\sw+\\)]" 1 font-lock-constant-face prepend)
@@ -2103,9 +2108,9 @@
 			'("label" "ref" "pageref" "vref" "eqref")
 			t))
 	    (citations-opt (regexp-opt
-			    '("cite" "caption" "index" "glossary"
+			    '("cite" "nocite" "caption" "index" "glossary"
 			      "footnote" "footnotemark" "footnotetext")
-			t))
+			    t))
 	    ;;
 	    ;; Names of commands that should be fontified.
 	    (specials (regexp-opt
@@ -2182,7 +2187,8 @@
   :group 'font-lock-extra-types)
 
 (defcustom c++-font-lock-extra-types
-  '("\\([iof]\\|str\\)+stream\\(buf\\)?" "ios"
+  '("\\sw+_t"
+    "\\([iof]\\|str\\)+stream\\(buf\\)?" "ios"
     "string" "rope"
     "list" "slist"
     "deque" "vector" "bit_vector"
@@ -2190,7 +2196,8 @@
     "map" "multimap"
     "hash\\(_\\(m\\(ap\\|ulti\\(map\\|set\\)\\)\\|set\\)\\)?"
     "stack" "queue" "priority_queue"
-    "iterator" "const_iterator" "reverse_iterator" "const_reverse_iterator")
+    "iterator" "const_iterator" "reverse_iterator" "const_reverse_iterator"
+    "reference" "const_reference")
   "*List of extra types to fontify in C++ mode.
 Each list item should be a regexp not containing word-delimiters.
 For example, a value of (\"string\") means the word string is treated as a type
@@ -2250,18 +2257,26 @@
 (let* ((c-keywords
 	(eval-when-compile
 	  (regexp-opt '("break" "continue" "do" "else" "for" "if" "return"
-			"switch" "while" "sizeof") t)))
-       (c-type-types
+			"switch" "while" "sizeof"
+			;; Type related, but we don't do anything special.
+			"typedef" "extern" "auto" "register" "static"
+			"volatile" "const") t)))
+       (c-type-specs
+	(eval-when-compile
+	  (regexp-opt '("enum" "struct" "union") t)))
+       (c-type-specs-depth
+	(regexp-opt-depth c-type-specs))
+       (c-type-names
 	`(mapconcat 'identity
 	  (cons 
 	   (,@ (eval-when-compile
 		 (regexp-opt
-		  '("auto" "extern" "register" "static" "typedef" "struct"
-		    "union" "enum" "signed" "unsigned" "short" "long"
-		    "int" "char" "float" "double" "void" "volatile" "const"))))
+		  '("char" "short" "int" "long" "signed" "unsigned"
+		    "float" "double" "void"))))
 	   c-font-lock-extra-types)
 	  "\\|"))
-       (c-type-depth `(regexp-opt-depth (,@ c-type-types)))
+       (c-type-names-depth
+	`(regexp-opt-depth (,@ c-type-names)))
        )
  (setq c-font-lock-keywords-1
   (list
@@ -2298,12 +2313,12 @@
     ;;
     ;; Simple regexps for speed.
     ;;
-    ;; Fontify all type specifiers.
+    ;; Fontify all type names.
     `(eval .
-      (cons (concat "\\<\\(" (,@ c-type-types) "\\)\\>") 'font-lock-type-face))
+      (cons (concat "\\<\\(" (,@ c-type-names) "\\)\\>") 'font-lock-type-face))
     ;;
     ;; Fontify all builtin keywords (except case, default and goto; see below).
-    (concat "\\<" c-keywords "\\>")
+    (concat "\\<\\(" c-keywords "\\|" c-type-specs "\\)\\>")
     ;;
     ;; Fontify case/goto keywords and targets, and case default/goto tags.
     '("\\<\\(case\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?"
@@ -2323,15 +2338,16 @@
    ;; We still have to fontify type specifiers individually, as C is so hairy.
    (list
     ;;
-    ;; Fontify all storage classes and type specifiers, plus their items.
+    ;; Fontify all storage types, plus their items.
     `(eval .
-      (list (concat "\\<\\(" (,@ c-type-types) "\\)\\>"
+      (list (concat "\\<\\(" (,@ c-type-names) "\\)\\>"
 		    "\\([ \t*&]+\\sw+\\>\\)*")
 	    ;; Fontify each declaration item.
 	    (list 'font-lock-match-c-style-declaration-item-and-skip-to-next
 		  ;; Start with point after all type specifiers.
-		  (list 'goto-char (list 'or (list 'match-beginning
-						   (+ (,@ c-type-depth) 2))
+		  (list 'goto-char (list 'or
+					 (list 'match-beginning
+					       (+ (,@ c-type-names-depth) 2))
 					 '(match-end 1)))
 		  ;; Finish with point after first type specifier.
 		  '(goto-char (match-end 1))
@@ -2340,13 +2356,24 @@
 			  font-lock-function-name-face
 			font-lock-variable-name-face)))))
     ;;
+    ;; Fontify all storage specs and types, plus their items.
+    `(eval .
+      (list (concat "\\<\\(" (,@ c-type-specs) "\\)\\>"
+		    "[ \t]*\\(\\sw+\\)?")
+	  (list 1 'font-lock-keyword-face)
+	  (list (+ (,@ c-type-specs-depth) 2) 'font-lock-type-face nil t)
+	  (list 'font-lock-match-c-style-declaration-item-and-skip-to-next
+		  nil nil
+		  ;; Fontify as a variable or function name.
+		  '(1 (if (match-beginning 2)
+			  font-lock-function-name-face
+			font-lock-variable-name-face) nil t))))
+    ;;
     ;; Fontify structures, or typedef names, plus their items.
     '("\\(}\\)[ \t*]*\\sw"
       (font-lock-match-c-style-declaration-item-and-skip-to-next
        (goto-char (match-end 1)) nil
-       (1 (if (match-beginning 2)
-	      font-lock-function-name-face
-	    font-lock-variable-name-face))))
+       (1 font-lock-type-face)))
     ;;
     ;; Fontify anything at beginning of line as a declaration or definition.
     '("^\\(\\sw+\\)\\>\\([ \t*]+\\sw+\\>\\)*"
@@ -2412,8 +2439,15 @@
 	  (regexp-opt
 	   '("break" "continue" "do" "else" "for" "if" "return" "switch"
 	     "while" "asm" "catch" "delete" "new" "sizeof" "this" "throw" "try"
-	     ;; Eric Hopper <hopper@omnifarious.mn.org> says these are new.
-	     "static_cast" "dynamic_cast" "const_cast" "reinterpret_cast") t)))
+	     ;; Branko Cibej <branko.cibej@hermes.si> says this is new.
+	     "export"
+	     ;; Mark Mitchell <mmitchell@usa.net> says these are new.
+	     "mutable" "explicit"
+	     ;; Alain Picard <ap@abelard.apana.org.au> suggests treating these
+	     ;; as keywords not types.
+	     "typedef" "template"
+	     "extern" "auto" "register" "const" "volatile" "static"
+	     "inline" "friend" "virtual") t)))
        (c++-operators
 	(eval-when-compile
 	  (regexp-opt
@@ -2421,34 +2455,40 @@
 	   '("+" "-" "*" "/" "%" "^" "&" "|" "~" "!" "=" "<" ">" "+=" "-="
 	     "*=" "/=" "%=" "^=" "&=" "|=" "<<" ">>" ">>=" "<<=" "==" "!="
 	     "<=" ">=" "&&" "||" "++" "--" "->*" "," "->" "[]" "()"))))
-       (c++-type-types
+       (c++-type-specs
+	(eval-when-compile
+	  (regexp-opt
+	   '("class" "public" "private" "protected" "typename"
+	     "struct" "union" "enum" "namespace" "using"
+	     ;; Eric Hopper <hopper@omnifarious.mn.org> says these are new.
+	     "static_cast" "dynamic_cast" "const_cast" "reinterpret_cast") t)))
+       (c++-type-specs-depth
+	(regexp-opt-depth c++-type-specs))
+       (c++-type-names
 	`(mapconcat 'identity
 	  (cons 
 	   (,@ (eval-when-compile
 		 (regexp-opt
-		  '("extern" "auto" "register" "static" "typedef" "struct"
-		    "union" "enum" "signed" "unsigned" "short" "long"
-		    "int" "char" "float" "double" "void" "volatile" "const"
-		    "inline" "friend" "bool" "virtual" "complex" "template"
-		    "namespace" "using"
-		    ;; Mark Mitchell <mmitchell@usa.net> says these are new.
-		    "explicit" "mutable"
-		    ;; Branko Cibej <branko.cibej@hermes.si> suggests this.
-		    "export"))))
+		  '("signed" "unsigned" "short" "long"
+		    "int" "char" "float" "double" "void"
+		    "bool" "complex"))))
 	   c++-font-lock-extra-types)
 	  "\\|"))
+       (c++-type-names-depth `(regexp-opt-depth (,@ c++-type-names)))
        ;;
        ;; A brave attempt to match templates following a type and/or match
        ;; class membership.  See and sync the above function
        ;; `font-lock-match-c++-style-declaration-item-and-skip-to-next'.
        (c++-type-suffix (concat "\\([ \t]*<\\([^>\n]+\\)[ \t*&]*>\\)?"
 				"\\([ \t]*::[ \t*~]*\\(\\sw+\\)\\)*"))
+       (c++-type-suffix-depth (regexp-opt-depth c++-type-suffix))
        ;; If the string is a type, it may be followed by the cruft above.
        (c++-type-spec (concat "\\(\\sw+\\)\\>" c++-type-suffix))
+       (c++-type-spec-depth (regexp-opt-depth c++-type-spec))
        ;;
        ;; Parenthesis depth of user-defined types not forgetting their cruft.
        (c++-type-depth `(regexp-opt-depth
-			 (concat (,@ c++-type-types) (,@ c++-type-suffix))))
+			 (concat (,@ c++-type-names) (,@ c++-type-suffix))))
        )
  (setq c++-font-lock-keywords-1
   (append
@@ -2457,23 +2497,12 @@
    (cdr c-font-lock-keywords-1)
    (list
     ;;
-    ;; Class names etc.
-    (list (concat "\\<\\(class\\|public\\|private\\|protected\\|typename\\)\\>"
-		  "[ \t]*"
-		  "\\(" c++-type-spec "\\)?")
-	  '(1 font-lock-type-face)
-	  '(3 (if (match-beginning 6)
-		  font-lock-type-face
-		font-lock-function-name-face) nil t)
-	  '(5 font-lock-function-name-face nil t)
-	  '(7 font-lock-function-name-face nil t))
-    ;;
     ;; Fontify function name definitions, possibly incorporating class names.
     (list (concat "^" c++-type-spec "[ \t]*(")
 	  '(1 (if (or (match-beginning 2) (match-beginning 4))
 		  font-lock-type-face
 		font-lock-function-name-face))
-	  '(3 font-lock-function-name-face nil t)
+	  '(3 font-lock-type-face nil t)
 	  '(5 font-lock-function-name-face nil t))
     )))
 
@@ -2483,7 +2512,7 @@
     ;;
     ;; The list `c-font-lock-keywords-2' for C++ plus operator overloading.
     `(eval .
-      (cons (concat "\\<\\(" (,@ c++-type-types) "\\)\\>")
+      (cons (concat "\\<\\(" (,@ c++-type-names) "\\)\\>")
 	    'font-lock-type-face))
     ;;
     ;; Fontify operator overloading.
@@ -2500,7 +2529,7 @@
 	   (1 font-lock-constant-face)))
     ;;
     ;; Fontify other builtin keywords.
-    (concat "\\<" c++-keywords "\\>")
+    (concat "\\<\\(" c++-keywords "\\|" c++-type-specs "\\)\\>")
     ;;
     ;; Eric Hopper <hopper@omnifarious.mn.org> says `true' and `false' are new.
     '("\\<\\(false\\|true\\)\\>" . font-lock-constant-face)
@@ -2514,8 +2543,10 @@
     ;;
     ;; Fontify all storage classes and type specifiers, plus their items.
     `(eval .
-      (list (concat "\\<\\(" (,@ c++-type-types) "\\)\\>" (,@ c++-type-suffix)
+      (list (concat "\\<\\(" (,@ c++-type-names) "\\)\\>" (,@ c++-type-suffix)
 		    "\\([ \t*&]+" (,@ c++-type-spec) "\\)*")
+	    ;; The name of any template type.
+	    (list (+ (,@ c++-type-names-depth) 3) 'font-lock-type-face nil t)
 	    ;; Fontify each declaration item.
 	    (list 'font-lock-match-c++-style-declaration-item-and-skip-to-next
 		  ;; Start with point after all type specifiers.
@@ -2529,18 +2560,42 @@
 			     font-lock-type-face)
 			    ((match-beginning 6) font-lock-function-name-face)
 			    (t font-lock-variable-name-face)))
-		  '(3 font-lock-function-name-face nil t)
+		  '(3 font-lock-type-face nil t)
 		  '(5 (if (match-beginning 6)
 			  font-lock-function-name-face
 			font-lock-variable-name-face) nil t))))
     ;;
+    ;; Fontify all storage specs and types, plus their items.
+    `(eval .
+      (list (concat "\\<" (,@ c++-type-specs) "\\>" (,@ c++-type-suffix)
+		    "[ \t]*\\(" (,@ c++-type-spec) "\\)?")
+	    ;; The name of any template type.
+	    (list (+ (,@ c++-type-specs-depth) 2) 'font-lock-type-face nil t)
+	    ;; The name of any type.
+	    (list (+ (,@ c++-type-specs-depth) (,@ c++-type-suffix-depth) 2)
+		  'font-lock-type-face nil t)
+	    ;; Fontify each declaration item.
+	    (list 'font-lock-match-c++-style-declaration-item-and-skip-to-next
+		  ;; Start with point after all type specifiers.
+		  nil
+		  ;; Finish with point after first type specifier.
+		  nil
+		  ;; Fontify as a variable or function name.
+		  '(1 (cond ((or (match-beginning 2) (match-beginning 4))
+			     font-lock-type-face)
+			    ((match-beginning 6) font-lock-function-name-face)
+			    (t font-lock-variable-name-face)))
+		  '(3 font-lock-type-face nil t)
+		  '(5 (if (match-beginning 6)
+			  font-lock-function-name-face
+			font-lock-variable-name-face) nil t))
+	    ))
+    ;;
     ;; Fontify structures, or typedef names, plus their items.
     '("\\(}\\)[ \t*]*\\sw"
       (font-lock-match-c++-style-declaration-item-and-skip-to-next
        (goto-char (match-end 1)) nil
-       (1 (if (match-beginning 6)
-	      font-lock-function-name-face
-	    font-lock-variable-name-face))))
+       (1 font-lock-type-face)))
     ;;
     ;; Fontify anything at beginning of line as a declaration or definition.
     (list (concat "^\\(" c++-type-spec "[ \t*&]*\\)+")
@@ -2551,7 +2606,7 @@
 		      font-lock-type-face)
 		     ((match-beginning 6) font-lock-function-name-face)
 		     (t font-lock-variable-name-face)))
-	    (3 font-lock-function-name-face nil t)
+	    (3 font-lock-type-face nil t)
 	    (5 (if (match-beginning 6)
 		   font-lock-function-name-face
 		 font-lock-variable-name-face) nil t)))
@@ -2580,19 +2635,28 @@
 (let* ((objc-keywords
 	(eval-when-compile
 	  (regexp-opt '("break" "continue" "do" "else" "for" "if" "return"
-			"switch" "while" "sizeof" "self" "super") t)))
-       (objc-type-types
+			"switch" "while" "sizeof" "self" "super"
+			"typedef" "auto" "extern" "static"
+			"volatile" "const") t)))
+       (objc-type-specs
+	(eval-when-compile
+	  (regexp-opt
+	   '("register" "struct" "union" "enum"
+	     "oneway" "in" "out" "inout" "bycopy" "byref") t)))
+       (objc-type-specs-depth
+	(regexp-opt-depth objc-type-specs))
+       (objc-type-names
 	`(mapconcat 'identity
 	  (cons
 	   (,@ (eval-when-compile
 		 (regexp-opt
-		  '("auto" "extern" "register" "static" "typedef" "struct"
-		    "union" "enum" "signed" "unsigned" "short" "long"
-		    "int" "char" "float" "double" "void" "volatile" "const"
-		    "id" "oneway" "in" "out" "inout" "bycopy" "byref"))))
+		  '("signed" "unsigned" "short" "long"
+		    "int" "char" "float" "double" "void"
+		    "id"))))
 	   objc-font-lock-extra-types)
 	  "\\|"))
-       (objc-type-depth `(regexp-opt-depth (,@ objc-type-types)))
+       (objc-type-names-depth
+	`(regexp-opt-depth (,@ objc-type-names)))
        )
  (setq objc-font-lock-keywords-1
   (append
@@ -2604,26 +2668,23 @@
     ;; Fontify compiler directives.
     '("@\\(\\sw+\\)\\>"
       (1 font-lock-keyword-face)
-      ("\\=[ \t:<(,]*\\(\\sw+\\)" nil nil
-       (1 font-lock-function-name-face)))
+      ("\\=[ \t:<,]*\\(\\sw+\\)" nil nil
+       (1 font-lock-type-face)))
     ;;
     ;; Fontify method names and arguments.  Oh Lordy!
     ;; First, on the same line as the function declaration.
-    '("^[+-][ \t]*\\(PRIVATE\\)?[ \t]*\\((\\([^)\n]+\\))\\)?[ \t]*\\(\\sw+\\)"
-      (1 font-lock-type-face nil t)
-      (3 font-lock-type-face nil t)
-      (4 font-lock-function-name-face)
-      ("\\=[ \t]*\\(\\sw+\\)?:[ \t]*\\((\\([^)\n]+\\))\\)?[ \t]*\\(\\sw+\\)"
+    '("^[+-][ \t]*\\(PRIVATE\\>\\)?[ \t]*\\(([^)\n]+)\\)?[ \t]*\\(\\sw+\\)"
+      (1 font-lock-keyword-face nil t)
+      (3 font-lock-function-name-face)
+      ("\\=[ \t]*\\(\\sw+\\)?:[ \t]*\\(([^)\n]+)\\)?[ \t]*\\(\\sw+\\)"
        nil nil
        (1 font-lock-function-name-face nil t)
-       (3 font-lock-type-face nil t)
-       (4 font-lock-variable-name-face)))
+       (3 font-lock-variable-name-face)))
     ;; Second, on lines following the function declaration.
-    '(":" ("^[ \t]*\\(\\sw+\\)?:[ \t]*\\((\\([^)\n]+\\))\\)?[ \t]*\\(\\sw+\\)"
+    '(":" ("^[ \t]*\\(\\sw+\\)?:[ \t]*\\(([^)\n]+)\\)?[ \t]*\\(\\sw+\\)"
 	   (beginning-of-line) (end-of-line)
 	   (1 font-lock-function-name-face nil t)
-	   (3 font-lock-type-face nil t)
-	   (4 font-lock-variable-name-face)))
+	   (3 font-lock-variable-name-face)))
     )))
 
  (setq objc-font-lock-keywords-2
@@ -2634,11 +2695,11 @@
     ;;
     ;; Fontify all type specifiers.
     `(eval .
-      (cons (concat "\\<\\(" (,@ objc-type-types) "\\)\\>")
+      (cons (concat "\\<\\(" (,@ objc-type-names) "\\)\\>")
 	    'font-lock-type-face))
     ;;
     ;; Fontify all builtin keywords (except case, default and goto; see below).
-    (concat "\\<" objc-keywords "\\>")
+    (concat "\\<\\(" objc-keywords "\\|" objc-type-specs "\\)\\>")
     ;;
     ;; Fontify case/goto keywords and targets, and case default/goto tags.
     '("\\<\\(case\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?"
@@ -2662,14 +2723,15 @@
     ;;
     ;; Fontify all storage classes and type specifiers, plus their items.
     `(eval .
-      (list (concat "\\<\\(" (,@ objc-type-types) "\\)\\>"
+      (list (concat "\\<\\(" (,@ objc-type-names) "\\)\\>"
 		    "\\([ \t*&]+\\sw+\\>\\)*")
 	    ;; Fontify each declaration item.
 	    (list 'font-lock-match-c-style-declaration-item-and-skip-to-next
 		  ;; Start with point after all type specifiers.
-		  (list 'goto-char (list 'or (list 'match-beginning
-						   (+ (,@ objc-type-depth) 2))
-					 '(match-end 1)))
+		  (list 'goto-char
+			(list 'or (list 'match-beginning
+					(+ (,@ objc-type-names-depth) 2))
+			      '(match-end 1)))
 		  ;; Finish with point after first type specifier.
 		  '(goto-char (match-end 1))
 		  ;; Fontify as a variable or function name.
@@ -2677,13 +2739,26 @@
 			  font-lock-function-name-face
 			font-lock-variable-name-face)))))
     ;;
+    ;; Fontify all storage specs and types, plus their items.
+    `(eval .
+      (list (concat "\\<\\(" (,@ objc-type-specs) "[ \t]*\\)+\\>"
+		    "[ \t]*\\(\\sw+\\)?")
+	    ;; The name of any type.
+	    (list (+ (,@ objc-type-specs-depth) 2) 'font-lock-type-face nil t)
+	    ;; Fontify each declaration item.
+	    (list 'font-lock-match-c++-style-declaration-item-and-skip-to-next
+		  nil nil
+		  ;; Fontify as a variable or function name.
+		  '(1 (if (match-beginning 2)
+			  font-lock-function-name-face
+			font-lock-variable-name-face)))
+	    ))
+    ;;
     ;; Fontify structures, or typedef names, plus their items.
     '("\\(}\\)[ \t*]*\\sw"
       (font-lock-match-c-style-declaration-item-and-skip-to-next
        (goto-char (match-end 1)) nil
-       (1 (if (match-beginning 2)
-	      font-lock-function-name-face
-	    font-lock-variable-name-face))))
+       (1 font-lock-type-face)))
     ;;
     ;; Fontify anything at beginning of line as a declaration or definition.
     '("^\\(\\sw+\\)\\>\\([ \t*]+\\sw+\\>\\)*"
@@ -2743,7 +2818,8 @@
        (java-other-types
 	'(mapconcat 'identity (cons "\\sw+\\.\\sw+" java-font-lock-extra-types)
 		    "\\|"))
-       (java-other-depth `(regexp-opt-depth (,@ java-other-types)))
+       (java-other-depth
+	`(regexp-opt-depth (,@ java-other-types)))
        )
  (setq java-font-lock-keywords-1
   (list
@@ -2762,11 +2838,10 @@
    (list
     ;;
     ;; Fontify all builtin type specifiers.
-    (cons (concat "\\<\\(" java-minor-types "\\|" java-major-types "\\)\\>")
-	  'font-lock-type-face)
+    (cons (concat "\\<" java-minor-types "\\>") 'font-lock-type-face)
     ;;
     ;; Fontify all builtin keywords (except below).
-    (concat "\\<" java-keywords "\\>")
+    (concat "\\<\\(" java-keywords "\\|" java-major-types "\\)\\>")
     ;;
     ;; Fontify keywords and targets, and case default/goto tags.
     (list "\\<\\(break\\|case\\|continue\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?"