* term/xterm.el (xterm--query): Stop after first matching handler. (Bug#14615)
[bpt/emacs.git] / lisp / progmodes / cc-fonts.el
CommitLineData
d9e94c22
MS
1;;; cc-fonts.el --- font lock support for CC Mode
2
ab422c4d 3;; Copyright (C) 2002-2013 Free Software Foundation, Inc.
d9e94c22
MS
4
5;; Authors: 2003- Alan Mackenzie
6;; 2002- Martin Stjernholm
7;; Maintainer: bug-cc-mode@gnu.org
8;; Created: 07-Jan-2002
bd78fa1d
CY
9;; Keywords: c languages
10;; Package: cc-mode
d9e94c22
MS
11
12;; This file is part of GNU Emacs.
13
b1fc2b50 14;; GNU Emacs is free software: you can redistribute it and/or modify
d9e94c22 15;; it under the terms of the GNU General Public License as published by
b1fc2b50
GM
16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version.
d9e94c22
MS
18
19;; GNU Emacs is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details.
23
24;; You should have received a copy of the GNU General Public License
b1fc2b50 25;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
d9e94c22
MS
26
27;;; Commentary:
28
29;; Some comments on the use of faces:
30;;
0386b551
AM
31;; o `c-label-face-name' is either `font-lock-constant-face' (in
32;; Emacs), or `font-lock-reference-face'.
d9e94c22
MS
33;;
34;; o `c-constant-face-name', `c-reference-face-name' and
35;; `c-doc-markup-face-name' are essentially set up like
36;; `c-label-face-name'.
37;;
38;; o `c-preprocessor-face-name' is `font-lock-preprocessor-face' in
39;; XEmacs and - in lack of a closer equivalent -
40;; `font-lock-builtin-face' or `font-lock-reference-face' in Emacs.
41;;
42;; o `c-doc-face-name' is `font-lock-doc-string-face' in XEmacs,
43;; `font-lock-doc-face' in Emacs 21 and later, or
44;; `font-lock-comment-face' in older Emacs (that since source
45;; documentation are actually comments in these languages, as opposed
46;; to elisp).
47;;
d9e94c22
MS
48;; TBD: We should probably provide real faces for the above uses and
49;; instead initialize them from the standard faces.
50
51;;; Code:
52
53;; The faces that already have been put onto the text is tested in
54;; various places to direct further fontifications. For this to work,
55;; the following assumptions regarding the faces must hold (apart from
56;; the dependencies on the font locking order):
57;;
58;; o `font-lock-comment-face' and the face in `c-doc-face-name' is
59;; not used in anything but comments.
60;; o If any face (e.g. `c-doc-markup-face-name') but those above is
61;; used in comments, it doesn't replace them.
62;; o `font-lock-string-face' is not used in anything but string
63;; literals (single or double quoted).
64;; o `font-lock-keyword-face' and the face in `c-label-face-name' are
65;; never overlaid with other faces.
66
67(eval-when-compile
68 (let ((load-path
69 (if (and (boundp 'byte-compile-dest-file)
70 (stringp byte-compile-dest-file))
71 (cons (file-name-directory byte-compile-dest-file) load-path)
72 load-path)))
73 (load "cc-bytecomp" nil t)))
74
75(cc-require 'cc-defs)
76(cc-require-when-compile 'cc-langs)
77(cc-require 'cc-vars)
78(cc-require 'cc-engine)
79(cc-require-when-compile 'cc-awk) ; Change from cc-require, 2003/6/18 to
80;; prevent cc-awk being loaded when it's not needed. There is now a (require
81;; 'cc-awk) in (defun awk-mode ..).
82
83;; Avoid repeated loading through the eval-after-load directive in
84;; cc-mode.el.
85(provide 'cc-fonts)
86
87(cc-external-require 'font-lock)
88
89(cc-bytecomp-defvar parse-sexp-lookup-properties) ; Emacs only.
90
91;; Need to declare these local symbols during compilation since
92;; they're referenced from lambdas in `byte-compile' calls that are
93;; executed at compile time. They don't need to have the proper
94;; definitions, though, since the generated functions aren't called
95;; during compilation.
96(cc-bytecomp-defvar c-preprocessor-face-name)
97(cc-bytecomp-defvar c-reference-face-name)
98(cc-bytecomp-defun c-fontify-recorded-types-and-refs)
99(cc-bytecomp-defun c-font-lock-declarators)
d9e94c22
MS
100(cc-bytecomp-defun c-font-lock-objc-method)
101(cc-bytecomp-defun c-font-lock-invalid-string)
102
d9e94c22
MS
103\f
104;; Note that font-lock in XEmacs doesn't expand face names as
105;; variables, so we have to use the (eval . FORM) in the font lock
106;; matchers wherever we use these alias variables.
107
108(defconst c-preprocessor-face-name
109 (cond ((c-face-name-p 'font-lock-preprocessor-face)
110 ;; XEmacs has a font-lock-preprocessor-face.
111 'font-lock-preprocessor-face)
112 ((c-face-name-p 'font-lock-builtin-face)
0386b551
AM
113 ;; In Emacs font-lock-builtin-face has traditionally been
114 ;; used for preprocessor directives.
d9e94c22
MS
115 'font-lock-builtin-face)
116 (t
117 'font-lock-reference-face)))
118
119(cc-bytecomp-defvar font-lock-constant-face)
120
121(defconst c-label-face-name
122 (cond ((c-face-name-p 'font-lock-label-face)
123 ;; If it happens to occur in the future. (Well, the more
124 ;; pragmatic reason is to get unique faces for the test
125 ;; suite.)
126 'font-lock-label-face)
127 ((and (c-face-name-p 'font-lock-constant-face)
128 (eq font-lock-constant-face 'font-lock-constant-face))
129 ;; Test both if font-lock-constant-face exists and that it's
130 ;; not an alias for something else. This is important since
131 ;; we compare already set faces in various places.
132 'font-lock-constant-face)
133 (t
134 'font-lock-reference-face)))
135
136(defconst c-constant-face-name
137 (if (and (c-face-name-p 'font-lock-constant-face)
138 (eq font-lock-constant-face 'font-lock-constant-face))
0386b551 139 ;; This doesn't exist in some earlier versions of XEmacs 21.
d9e94c22
MS
140 'font-lock-constant-face
141 c-label-face-name))
142
143(defconst c-reference-face-name
0386b551
AM
144 (with-no-warnings
145 (if (and (c-face-name-p 'font-lock-reference-face)
146 (eq font-lock-reference-face 'font-lock-reference-face))
147 ;; This is considered obsolete in Emacs, but it still maps well
148 ;; to this use. (Another reason to do this is to get unique
149 ;; faces for the test suite.)
150 'font-lock-reference-face
151 c-label-face-name)))
d9e94c22
MS
152
153;; This should not mapped to a face that also is used to fontify things
154;; that aren't comments or string literals.
155(defconst c-doc-face-name
156 (cond ((c-face-name-p 'font-lock-doc-string-face)
157 ;; XEmacs.
158 'font-lock-doc-string-face)
159 ((c-face-name-p 'font-lock-doc-face)
160 ;; Emacs 21 and later.
161 'font-lock-doc-face)
162 (t
163 'font-lock-comment-face)))
164
165(defconst c-doc-markup-face-name
166 (if (c-face-name-p 'font-lock-doc-markup-face)
167 ;; If it happens to occur in the future. (Well, the more
168 ;; pragmatic reason is to get unique faces for the test
169 ;; suite.)
170 'font-lock-doc-markup-face
171 c-label-face-name))
172
0386b551
AM
173(defconst c-negation-char-face-name
174 (if (c-face-name-p 'font-lock-negation-char-face)
175 ;; Emacs 22 has a special face for negation chars.
176 'font-lock-negation-char-face))
d9e94c22
MS
177
178(cc-bytecomp-defun face-inverse-video-p) ; Only in Emacs.
d9e94c22
MS
179
180(defun c-make-inverse-face (oldface newface)
181 ;; Emacs and XEmacs have completely different face manipulation
182 ;; routines. :P
d9e94c22
MS
183 (copy-face oldface newface)
184 (cond ((fboundp 'face-inverse-video-p)
0386b551
AM
185 ;; Emacs. This only looks at the inverse flag in the current
186 ;; frame. Other display configurations might be different,
187 ;; but it can only show if the same Emacs has frames on
188 ;; e.g. a color and a monochrome display simultaneously.
d9e94c22
MS
189 (unless (face-inverse-video-p oldface)
190 (invert-face newface)))
191 ((fboundp 'face-property-instance)
192 ;; XEmacs. Same pitfall here.
193 (unless (face-property-instance oldface 'reverse)
0386b551 194 (invert-face newface)))))
d9e94c22 195
28d3917c
CY
196(defvar c-annotation-face 'c-annotation-face)
197
198(defface c-annotation-face
199 '((default :inherit font-lock-constant-face))
200 "Face for highlighting annotations in Java mode and similar modes."
201 :version "24.1"
202 :group 'c)
452ea855 203
d9e94c22 204(eval-and-compile
b128268e
AM
205 ;; We need the following definitions during compilation since they're
206 ;; used when the `c-lang-defconst' initializers are evaluated. Define
207 ;; them at runtime too for the sake of derived modes.
208
209 ;; This indicates the "font locking context", and is set just before
210 ;; fontification is done. If non-nil, it says, e.g., point starts
211 ;; from within a #if preprocessor construct.
212 (defvar c-font-lock-context nil)
213 (make-variable-buffer-local 'c-font-lock-context)
7d0ee75c 214
d9e94c22
MS
215 (defmacro c-put-font-lock-face (from to face)
216 ;; Put a face on a region (overriding any existing face) in the way
217 ;; font-lock would do it. In XEmacs that means putting an
218 ;; additional font-lock property, or else the font-lock package
219 ;; won't recognize it as fontified and might override it
220 ;; incorrectly.
0386b551
AM
221 ;;
222 ;; This function does a hidden buffer change.
d9e94c22
MS
223 (if (fboundp 'font-lock-set-face)
224 ;; Note: This function has no docstring in XEmacs so it might be
225 ;; considered internal.
226 `(font-lock-set-face ,from ,to ,face)
227 `(put-text-property ,from ,to 'face ,face)))
228
229 (defmacro c-remove-font-lock-face (from to)
230 ;; This is the inverse of `c-put-font-lock-face'.
0386b551
AM
231 ;;
232 ;; This function does a hidden buffer change.
d9e94c22
MS
233 (if (fboundp 'font-lock-remove-face)
234 `(font-lock-remove-face ,from ,to)
235 `(remove-text-properties ,from ,to '(face nil))))
236
237 (defmacro c-put-font-lock-string-face (from to)
238 ;; Put `font-lock-string-face' on a string. The surrounding
239 ;; quotes are included in Emacs but not in XEmacs. The passed
240 ;; region should include them.
0386b551
AM
241 ;;
242 ;; This function does a hidden buffer change.
d9e94c22
MS
243 (if (featurep 'xemacs)
244 `(c-put-font-lock-face (1+ ,from) (1- ,to) 'font-lock-string-face)
245 `(c-put-font-lock-face ,from ,to 'font-lock-string-face)))
246
247 (defmacro c-fontify-types-and-refs (varlist &rest body)
248 ;; Like `let', but additionally activates `c-record-type-identifiers'
249 ;; and `c-record-ref-identifiers', and fontifies the recorded ranges
250 ;; accordingly on exit.
0386b551
AM
251 ;;
252 ;; This function does hidden buffer changes.
d9e94c22
MS
253 `(let ((c-record-type-identifiers t)
254 c-record-ref-identifiers
255 ,@varlist)
256 (prog1 (progn ,@body)
257 (c-fontify-recorded-types-and-refs))))
258 (put 'c-fontify-types-and-refs 'lisp-indent-function 1)
d9e94c22
MS
259
260 (defun c-skip-comments-and-strings (limit)
261 ;; If the point is within a region fontified as a comment or
262 ;; string literal skip to the end of it or to LIMIT, whichever
263 ;; comes first, and return t. Otherwise return nil. The match
264 ;; data is not clobbered.
0386b551
AM
265 ;;
266 ;; This function might do hidden buffer changes.
d9e94c22
MS
267 (when (c-got-face-at (point) c-literal-faces)
268 (while (progn
269 (goto-char (next-single-property-change
270 (point) 'face nil limit))
271 (and (< (point) limit)
272 (c-got-face-at (point) c-literal-faces))))
273 t))
274
0386b551
AM
275 (defun c-make-syntactic-matcher (regexp)
276 ;; Returns a byte compiled function suitable for use in place of a
277 ;; regexp string in a `font-lock-keywords' matcher, except that
278 ;; only matches outside comments and string literals count.
279 ;;
280 ;; This function does not do any hidden buffer changes, but the
281 ;; generated functions will. (They are however used in places
282 ;; covered by the font-lock context.)
283 (byte-compile
284 `(lambda (limit)
285 (let (res)
286 (while (and (setq res (re-search-forward ,regexp limit t))
287 (progn
288 (goto-char (match-beginning 0))
289 (or (c-skip-comments-and-strings limit)
290 (progn
291 (goto-char (match-end 0))
292 nil)))))
293 res))))
294
b128268e 295 (defun c-make-font-lock-search-form (regexp highlights)
8d5ed899 296 ;; Return a lisp form which will fontify every occurrence of REGEXP
b128268e
AM
297 ;; (a regular expression, NOT a function) between POINT and `limit'
298 ;; with HIGHLIGHTS, a list of highlighters as specified on page
299 ;; "Search-based Fontification" in the elisp manual.
300 `(while (re-search-forward ,regexp limit t)
301 (unless (progn
302 (goto-char (match-beginning 0))
303 (c-skip-comments-and-strings limit))
304 (goto-char (match-end 0))
305 ,@(mapcar
306 (lambda (highlight)
307 (if (integerp (car highlight))
308 ;; e.g. highlight is (1 font-lock-type-face t)
309 (progn
310 (unless (eq (nth 2 highlight) t)
311 (error
312 "The override flag must currently be t in %s"
313 highlight))
314 (when (nth 3 highlight)
315 (error
316 "The laxmatch flag may currently not be set in %s"
317 highlight))
318 `(save-match-data
319 (c-put-font-lock-face
320 (match-beginning ,(car highlight))
321 (match-end ,(car highlight))
322 ,(elt highlight 1))))
f6b1b0a8 323 ;; highlight is an "ANCHORED HIGHLIGHTER" of the form
b128268e
AM
324 ;; (ANCHORED-MATCHER PRE-FORM POST-FORM SUBEXP-HIGHLIGHTERS...)
325 (when (nth 3 highlight)
326 (error "Match highlights currently not supported in %s"
327 highlight))
328 `(progn
329 ,(nth 1 highlight)
330 (save-match-data ,(car highlight))
331 ,(nth 2 highlight))))
332 highlights))))
333
d9e94c22
MS
334 (defun c-make-font-lock-search-function (regexp &rest highlights)
335 ;; This function makes a byte compiled function that works much like
336 ;; a matcher element in `font-lock-keywords'. It cuts out a little
337 ;; bit of the overhead compared to a real matcher. The main reason
338 ;; is however to pass the real search limit to the anchored
339 ;; matcher(s), since most (if not all) font-lock implementations
e15f8aaa 340 ;; arbitrarily limit anchored matchers to the same line, and also
d9e94c22
MS
341 ;; to insulate against various other irritating differences between
342 ;; the different (X)Emacs font-lock packages.
343 ;;
344 ;; REGEXP is the matcher, which must be a regexp. Only matches
345 ;; where the beginning is outside any comment or string literal are
346 ;; significant.
347 ;;
348 ;; HIGHLIGHTS is a list of highlight specs, just like in
349 ;; `font-lock-keywords', with these limitations: The face is always
350 ;; overridden (no big disadvantage, since hits in comments etc are
351 ;; filtered anyway), there is no "laxmatch", and an anchored matcher
352 ;; is always a form which must do all the fontification directly.
353 ;; `limit' is a variable bound to the real limit in the context of
354 ;; the anchored matcher forms.
355 ;;
356 ;; This function does not do any hidden buffer changes, but the
0386b551
AM
357 ;; generated functions will. (They are however used in places
358 ;; covered by the font-lock context.)
d9e94c22
MS
359
360 ;; Note: Replace `byte-compile' with `eval' to debug the generated
e15f8aaa 361 ;; lambda more easily.
d9e94c22
MS
362 (byte-compile
363 `(lambda (limit)
b128268e 364 (let ( ;; The font-lock package in Emacs is known to clobber
d9e94c22
MS
365 ;; `parse-sexp-lookup-properties' (when it exists).
366 (parse-sexp-lookup-properties
367 (cc-eval-when-compile
368 (boundp 'parse-sexp-lookup-properties))))
b128268e
AM
369
370 ;; (while (re-search-forward ,regexp limit t)
371 ;; (unless (progn
372 ;; (goto-char (match-beginning 0))
373 ;; (c-skip-comments-and-strings limit))
374 ;; (goto-char (match-end 0))
375 ;; ,@(mapcar
376 ;; (lambda (highlight)
377 ;; (if (integerp (car highlight))
378 ;; (progn
379 ;; (unless (eq (nth 2 highlight) t)
380 ;; (error
381 ;; "The override flag must currently be t in %s"
382 ;; highlight))
383 ;; (when (nth 3 highlight)
384 ;; (error
385 ;; "The laxmatch flag may currently not be set in %s"
386 ;; highlight))
387 ;; `(save-match-data
388 ;; (c-put-font-lock-face
389 ;; (match-beginning ,(car highlight))
390 ;; (match-end ,(car highlight))
391 ;; ,(elt highlight 1))))
392 ;; (when (nth 3 highlight)
393 ;; (error "Match highlights currently not supported in %s"
394 ;; highlight))
395 ;; `(progn
396 ;; ,(nth 1 highlight)
397 ;; (save-match-data ,(car highlight))
398 ;; ,(nth 2 highlight))))
399 ;; highlights)))
400 ,(c-make-font-lock-search-form regexp highlights))
401
0386b551
AM
402 nil)))
403
ef8cdf8c
AM
404 (defun c-make-font-lock-BO-decl-search-function (regexp &rest highlights)
405 ;; This function makes a byte compiled function that first moves back
406 ;; to the beginning of the current declaration (if any), then searches
407 ;; forward for matcher elements (as in `font-lock-keywords') and
408 ;; fontifies them.
409 ;;
410 ;; The motivation for moving back to the declaration start is to
411 ;; establish a context for the current text when, e.g., a character
412 ;; is typed on a C++ inheritance continuation line, or a jit-lock
413 ;; chunk starts there.
7d0ee75c 414 ;;
ef8cdf8c
AM
415 ;; The new function works much like a matcher element in
416 ;; `font-lock-keywords'. It cuts out a little bit of the overhead
417 ;; compared to a real matcher. The main reason is however to pass the
418 ;; real search limit to the anchored matcher(s), since most (if not
419 ;; all) font-lock implementations arbitrarily limit anchored matchers
420 ;; to the same line, and also to insulate against various other
421 ;; irritating differences between the different (X)Emacs font-lock
422 ;; packages.
423 ;;
424 ;; REGEXP is the matcher, which must be a regexp. Only matches
425 ;; where the beginning is outside any comment or string literal are
426 ;; significant.
427 ;;
428 ;; HIGHLIGHTS is a list of highlight specs, just like in
429 ;; `font-lock-keywords', with these limitations: The face is always
430 ;; overridden (no big disadvantage, since hits in comments etc are
431 ;; filtered anyway), there is no "laxmatch", and an anchored matcher
432 ;; is always a form which must do all the fontification directly.
433 ;; `limit' is a variable bound to the real limit in the context of
434 ;; the anchored matcher forms.
435 ;;
436 ;; This function does not do any hidden buffer changes, but the
437 ;; generated functions will. (They are however used in places
438 ;; covered by the font-lock context.)
439
440 ;; Note: Replace `byte-compile' with `eval' to debug the generated
441 ;; lambda more easily.
442 (byte-compile
443 `(lambda (limit)
444 (let ( ;; The font-lock package in Emacs is known to clobber
445 ;; `parse-sexp-lookup-properties' (when it exists).
446 (parse-sexp-lookup-properties
447 (cc-eval-when-compile
9657183b
AM
448 (boundp 'parse-sexp-lookup-properties)))
449 (BOD-limit
450 (c-determine-limit 1000)))
ef8cdf8c
AM
451 (goto-char
452 (let ((here (point)))
9657183b 453 (if (eq (car (c-beginning-of-decl-1 BOD-limit)) 'same)
ef8cdf8c
AM
454 (point)
455 here)))
456 ,(c-make-font-lock-search-form regexp highlights))
457 nil)))
458
b128268e
AM
459 (defun c-make-font-lock-context-search-function (normal &rest state-stanzas)
460 ;; This function makes a byte compiled function that works much like
461 ;; a matcher element in `font-lock-keywords', with the following
462 ;; enhancement: the generated function will test for particular "font
463 ;; lock contexts" at the start of the region, i.e. is this point in
464 ;; the middle of some particular construct? if so the generated
465 ;; function will first fontify the tail of the construct, before
466 ;; going into the main loop and fontify full constructs up to limit.
467 ;;
468 ;; The generated function takes one parameter called `limit', and
469 ;; will fontify the region between POINT and LIMIT.
470 ;;
471 ;; NORMAL is a list of the form (REGEXP HIGHLIGHTS .....), and is
472 ;; used to fontify the "regular" bit of the region.
473 ;; STATE-STANZAS is list of elements of the form (STATE LIM REGEXP
474 ;; HIGHLIGHTS), each element coding one possible font lock context.
475
476 ;; o - REGEXP is a font-lock regular expression (NOT a function),
477 ;; o - HIGHLIGHTS is a list of zero or more highlighters as defined
478 ;; on page "Search-based Fontification" in the elisp manual. As
479 ;; yet (2009-06), they must have OVERRIDE set, and may not have
480 ;; LAXMATCH set.
481 ;;
482 ;; o - STATE is the "font lock context" (e.g. in-cpp-expr) and is
483 ;; not quoted.
484 ;; o - LIM is a lisp form whose evaluation will yield the limit
485 ;; position in the buffer for fontification by this stanza.
486 ;;
487 ;; This function does not do any hidden buffer changes, but the
488 ;; generated functions will. (They are however used in places
489 ;; covered by the font-lock context.)
7d0ee75c 490 ;;
b128268e
AM
491 ;; Note: Replace `byte-compile' with `eval' to debug the generated
492 ;; lambda more easily.
493 (byte-compile
494 `(lambda (limit)
495 (let ( ;; The font-lock package in Emacs is known to clobber
496 ;; `parse-sexp-lookup-properties' (when it exists).
497 (parse-sexp-lookup-properties
498 (cc-eval-when-compile
499 (boundp 'parse-sexp-lookup-properties))))
500 ,@(mapcar
501 (lambda (stanza)
502 (let ((state (car stanza))
503 (lim (nth 1 stanza))
504 (regexp (nth 2 stanza))
505 (highlights (cdr (cddr stanza))))
506 `(if (eq c-font-lock-context ',state)
507 (let ((limit ,lim))
508 ,(c-make-font-lock-search-form
509 regexp highlights)))))
510 state-stanzas)
511 ,(c-make-font-lock-search-form (car normal) (cdr normal))
512 nil))))
513
3c0ab532
AM
514; (eval-after-load "edebug" ; 2006-07-09: def-edebug-spec is now in subr.el.
515; '(progn
516 (def-edebug-spec c-fontify-types-and-refs let*)
517 (def-edebug-spec c-make-syntactic-matcher t)
518 ;; If there are literal quoted or backquoted highlight specs in
519 ;; the call to `c-make-font-lock-search-function' then let's
520 ;; instrument the forms in them.
521 (def-edebug-spec c-make-font-lock-search-function
522 (form &rest &or ("quote" (&rest form)) ("`" (&rest form)) form)));))
d9e94c22
MS
523
524(defun c-fontify-recorded-types-and-refs ()
0386b551 525 ;; Convert the ranges recorded on `c-record-type-identifiers' and
d9e94c22 526 ;; `c-record-ref-identifiers' to fontification.
0386b551
AM
527 ;;
528 ;; This function does hidden buffer changes.
d9e94c22
MS
529 (let (elem)
530 (while (consp c-record-type-identifiers)
531 (setq elem (car c-record-type-identifiers)
532 c-record-type-identifiers (cdr c-record-type-identifiers))
533 (c-put-font-lock-face (car elem) (cdr elem)
534 'font-lock-type-face))
535 (while c-record-ref-identifiers
536 (setq elem (car c-record-ref-identifiers)
537 c-record-ref-identifiers (cdr c-record-ref-identifiers))
538 ;; Note that the reference face is a variable that is
539 ;; dereferenced, since it's an alias in Emacs.
540 (c-put-font-lock-face (car elem) (cdr elem)
541 c-reference-face-name))))
542
543(c-lang-defconst c-cpp-matchers
544 "Font lock matchers for preprocessor directives and purely lexical
545stuff. Used on level 1 and higher."
546
547 ;; Note: `c-font-lock-declarations' assumes that no matcher here
548 ;; sets `font-lock-type-face' in languages where
549 ;; `c-recognize-<>-arglists' is set.
550
551 t `(,@(when (c-lang-const c-opt-cpp-prefix)
552 (let* ((noncontinued-line-end "\\(\\=\\|\\(\\=\\|[^\\]\\)[\n\r]\\)")
0386b551
AM
553 (ncle-depth (regexp-opt-depth noncontinued-line-end))
554 (sws-depth (c-lang-const c-syntactic-ws-depth))
555 (nsws-depth (c-lang-const c-nonempty-syntactic-ws-depth)))
556
d9e94c22
MS
557 `(;; The stuff after #error and #warning is a message, so
558 ;; fontify it as a string.
0386b551 559 ,@(when (c-lang-const c-cpp-message-directives)
2ae6c6b5 560 (let* ((re (c-make-keywords-re 'appendable ; nil
0386b551
AM
561 (c-lang-const c-cpp-message-directives)))
562 (re-depth (regexp-opt-depth re)))
563 `((,(concat noncontinued-line-end
564 (c-lang-const c-opt-cpp-prefix)
565 re
566 "\\s +\\(.*\\)$")
2ae6c6b5 567 ,(+ ncle-depth re-depth 1) font-lock-string-face t))))
d9e94c22
MS
568
569 ;; Fontify filenames in #include <...> as strings.
0386b551
AM
570 ,@(when (c-lang-const c-cpp-include-directives)
571 (let* ((re (c-make-keywords-re nil
572 (c-lang-const c-cpp-include-directives)))
573 (re-depth (regexp-opt-depth re)))
574 `((,(concat noncontinued-line-end
575 (c-lang-const c-opt-cpp-prefix)
576 re
577 (c-lang-const c-syntactic-ws)
578 "\\(<[^>\n\r]*>?\\)")
579 (,(+ ncle-depth re-depth sws-depth 1)
580 font-lock-string-face)
581
582 ;; Use an anchored matcher to put paren syntax
583 ;; on the brackets.
584 (,(byte-compile
585 `(lambda (limit)
586 (let ((beg (match-beginning
587 ,(+ ncle-depth re-depth sws-depth 1)))
588 (end (1- (match-end ,(+ ncle-depth re-depth
589 sws-depth 1)))))
590 (if (eq (char-after end) ?>)
591 (progn
592 (c-mark-<-as-paren beg)
593 (c-mark->-as-paren end))
0ec1d2c5
AM
594 ;; (c-clear-char-property beg 'syntax-table)
595 (c-clear-char-property beg 'category)))
0386b551 596 nil)))))))
d9e94c22
MS
597
598 ;; #define.
0386b551
AM
599 ,@(when (c-lang-const c-opt-cpp-macro-define)
600 `((,(c-make-font-lock-search-function
601 (concat
602 noncontinued-line-end
603 (c-lang-const c-opt-cpp-prefix)
604 (c-lang-const c-opt-cpp-macro-define)
605 (c-lang-const c-nonempty-syntactic-ws)
606 "\\(" (c-lang-const ; 1 + ncle + nsws
607 c-symbol-key) "\\)"
608 (concat "\\(" ; 2 + ncle + nsws + c-sym-key
609 ;; Macro with arguments - a "function".
610 "\\(\(\\)" ; 3 + ncle + nsws + c-sym-key
611 "\\|"
612 ;; Macro without arguments - a "variable".
613 "\\([^\(]\\|$\\)"
614 "\\)"))
615 `((if (match-beginning
616 ,(+ 3 ncle-depth nsws-depth
617 (c-lang-const c-symbol-key-depth)))
618
619 ;; "Function". Fontify the name and the arguments.
620 (save-restriction
621 (c-put-font-lock-face
622 (match-beginning ,(+ 1 ncle-depth nsws-depth))
623 (match-end ,(+ 1 ncle-depth nsws-depth))
624 'font-lock-function-name-face)
625 (goto-char
626 (match-end
627 ,(+ 3 ncle-depth nsws-depth
628 (c-lang-const c-symbol-key-depth))))
629
630 (narrow-to-region (point-min) limit)
631 (while (and
632 (progn
633 (c-forward-syntactic-ws)
634 (looking-at c-symbol-key))
635 (progn
636 (c-put-font-lock-face
637 (match-beginning 0) (match-end 0)
638 'font-lock-variable-name-face)
639 (goto-char (match-end 0))
640 (c-forward-syntactic-ws)
641 (eq (char-after) ?,)))
642 (forward-char)))
643
644 ;; "Variable".
645 (c-put-font-lock-face
646 (match-beginning ,(+ 1 ncle-depth nsws-depth))
647 (match-end ,(+ 1 ncle-depth nsws-depth))
648 'font-lock-variable-name-face)))))))
d9e94c22
MS
649
650 ;; Fontify cpp function names in preprocessor
651 ;; expressions in #if and #elif.
0386b551
AM
652 ,@(when (and (c-lang-const c-cpp-expr-directives)
653 (c-lang-const c-cpp-expr-functions))
654 (let ((ced-re (c-make-keywords-re t
655 (c-lang-const c-cpp-expr-directives)))
656 (cef-re (c-make-keywords-re t
657 (c-lang-const c-cpp-expr-functions))))
b128268e
AM
658
659 `((,(c-make-font-lock-context-search-function
660 `(,(concat noncontinued-line-end
661 (c-lang-const c-opt-cpp-prefix)
662 ced-re ; 1 + ncle-depth
663 ;; Match the whole logical line to look
664 ;; for the functions in.
665 "\\(\\\\\\(.\\|[\n\r]\\)\\|[^\n\r]\\)*")
666 ((let ((limit (match-end 0)))
667 (while (re-search-forward ,cef-re limit 'move)
668 (c-put-font-lock-face (match-beginning 1)
669 (match-end 1)
670 c-preprocessor-face-name)))
671 (goto-char (match-end ,(1+ ncle-depth)))))
672 `(in-cpp-expr
673 (save-excursion (c-end-of-macro) (point))
674 ,cef-re
675 (1 c-preprocessor-face-name t)))))))
d9e94c22
MS
676
677 ;; Fontify the directive names.
678 (,(c-make-font-lock-search-function
679 (concat noncontinued-line-end
680 "\\("
681 (c-lang-const c-opt-cpp-prefix)
682 "[" (c-lang-const c-symbol-chars) "]+"
683 "\\)")
684 `(,(1+ ncle-depth) c-preprocessor-face-name t)))
bd8cf505 685
0386b551
AM
686 (eval . (list ,(c-make-syntactic-matcher
687 (concat noncontinued-line-end
688 (c-lang-const c-opt-cpp-prefix)
689 "if\\(n\\)def\\>"))
690 ,(+ ncle-depth 1)
691 c-negation-char-face-name
692 'append))
d9e94c22
MS
693 )))
694
695 ,@(when (c-major-mode-is 'pike-mode)
0386b551 696 ;; Recognize hashbangs in Pike.
d9e94c22
MS
697 `((eval . (list "\\`#![^\n\r]*"
698 0 c-preprocessor-face-name))))
699
0386b551 700 ;; Make hard spaces visible through an inverted `font-lock-warning-face'.
d9e94c22
MS
701 (eval . (list
702 "\240"
703 0 (progn
0386b551
AM
704 (unless (c-face-name-p 'c-nonbreakable-space-face)
705 (c-make-inverse-face 'font-lock-warning-face
706 'c-nonbreakable-space-face))
707 ''c-nonbreakable-space-face)))
d9e94c22
MS
708 ))
709
710(defun c-font-lock-invalid-string ()
711 ;; Assuming the point is after the opening character of a string,
0386b551 712 ;; fontify that char with `font-lock-warning-face' if the string
a6782a6e 713 ;; decidedly isn't terminated properly.
0386b551
AM
714 ;;
715 ;; This function does hidden buffer changes.
a6782a6e
MS
716 (let ((start (1- (point))))
717 (save-excursion
0386b551
AM
718 (and (eq (elt (parse-partial-sexp start (c-point 'eol)) 8) start)
719 (if (integerp c-multiline-string-start-char)
720 ;; There's no multiline string start char before the
721 ;; string, so newlines aren't allowed.
722 (not (eq (char-before start) c-multiline-string-start-char))
723 ;; Multiline strings are allowed anywhere if
724 ;; c-multiline-string-start-char is t.
725 (not c-multiline-string-start-char))
726 (if c-string-escaped-newlines
a6782a6e
MS
727 ;; There's no \ before the newline.
728 (not (eq (char-before (point)) ?\\))
0386b551 729 ;; Escaped newlines aren't supported.
a6782a6e 730 t)
0386b551 731 (c-put-font-lock-face start (1+ start) 'font-lock-warning-face)))))
d9e94c22
MS
732
733(c-lang-defconst c-basic-matchers-before
734 "Font lock matchers for basic keywords, labels, references and various
735other easily recognizable things that should be fontified before generic
736casts and declarations are fontified. Used on level 2 and higher."
737
738 ;; Note: `c-font-lock-declarations' assumes that no matcher here
739 ;; sets `font-lock-type-face' in languages where
740 ;; `c-recognize-<>-arglists' is set.
741
742 t `(;; Put a warning face on the opener of unclosed strings that
743 ;; can't span lines. Later font
744 ;; lock packages have a `font-lock-syntactic-face-function' for
745 ;; this, but it doesn't give the control we want since any
746 ;; fontification done inside the function will be
747 ;; unconditionally overridden.
748 ,(c-make-font-lock-search-function
749 ;; Match a char before the string starter to make
750 ;; `c-skip-comments-and-strings' work correctly.
751 (concat ".\\(" c-string-limit-regexp "\\)")
752 '((c-font-lock-invalid-string)))
753
754 ;; Fontify keyword constants.
755 ,@(when (c-lang-const c-constant-kwds)
756 (let ((re (c-make-keywords-re nil (c-lang-const c-constant-kwds))))
757 (if (c-major-mode-is 'pike-mode)
758 ;; No symbol is a keyword after "->" in Pike.
0386b551 759 `((eval . (list ,(concat "\\(\\=.?\\|[^>]\\|[^-]>\\)"
d9e94c22 760 "\\<\\(" re "\\)\\>")
0386b551 761 2 c-constant-face-name)))
d9e94c22
MS
762 `((eval . (list ,(concat "\\<\\(" re "\\)\\>")
763 1 c-constant-face-name))))))
764
765 ;; Fontify all keywords except the primitive types.
766 ,(if (c-major-mode-is 'pike-mode)
767 ;; No symbol is a keyword after "->" in Pike.
0386b551 768 `(,(concat "\\(\\=.?\\|[^>]\\|[^-]>\\)"
d9e94c22 769 "\\<" (c-lang-const c-regular-keywords-regexp))
0386b551 770 2 font-lock-keyword-face)
d9e94c22
MS
771 `(,(concat "\\<" (c-lang-const c-regular-keywords-regexp))
772 1 font-lock-keyword-face))
773
774 ;; Fontify leading identifiers in fully qualified names like
775 ;; "foo::bar" in languages that supports such things.
776 ,@(when (c-lang-const c-opt-identifier-concat-key)
2a15eb73
MS
777 (if (c-major-mode-is 'java-mode)
778 ;; Java needs special treatment since "." is used both to
779 ;; qualify names and in normal indexing. Here we look for
780 ;; capital characters at the beginning of an identifier to
781 ;; recognize the class. "*" is also recognized to cover
782 ;; wildcard import declarations. All preceding dot separated
783 ;; identifiers are taken as package names and therefore
784 ;; fontified as references.
785 `(,(c-make-font-lock-search-function
786 ;; Search for class identifiers preceded by ".". The
787 ;; anchored matcher takes it from there.
788 (concat (c-lang-const c-opt-identifier-concat-key)
0386b551 789 (c-lang-const c-simple-ws) "*"
2a15eb73 790 (concat "\\("
0386b551
AM
791 "[" c-upper "]"
792 "[" (c-lang-const c-symbol-chars) "]*"
2a15eb73
MS
793 "\\|"
794 "\\*"
795 "\\)"))
796 `((let (id-end)
797 (goto-char (1+ (match-beginning 0)))
798 (while (and (eq (char-before) ?.)
799 (progn
800 (backward-char)
801 (c-backward-syntactic-ws)
802 (setq id-end (point))
803 (< (skip-chars-backward
804 ,(c-lang-const c-symbol-chars)) 0))
805 (not (get-text-property (point) 'face)))
0386b551
AM
806 (c-put-font-lock-face (point) id-end
807 c-reference-face-name)
2a15eb73
MS
808 (c-backward-syntactic-ws)))
809 nil
810 (goto-char (match-end 0)))))
811
812 `((,(byte-compile
0386b551
AM
813 ;; Must use a function here since we match longer than
814 ;; we want to move before doing a new search. This is
815 ;; not necessary for XEmacs since it restarts the
816 ;; search from the end of the first highlighted
817 ;; submatch (something that causes problems in other
818 ;; places).
2a15eb73
MS
819 `(lambda (limit)
820 (while (re-search-forward
821 ,(concat "\\(\\<" ; 1
822 "\\(" (c-lang-const c-symbol-key) "\\)" ; 2
0386b551 823 (c-lang-const c-simple-ws) "*"
2a15eb73 824 (c-lang-const c-opt-identifier-concat-key)
0386b551 825 (c-lang-const c-simple-ws) "*"
2a15eb73
MS
826 "\\)"
827 "\\("
828 (c-lang-const c-opt-after-id-concat-key)
829 "\\)")
830 limit t)
831 (unless (progn
832 (goto-char (match-beginning 0))
833 (c-skip-comments-and-strings limit))
834 (or (get-text-property (match-beginning 2) 'face)
835 (c-put-font-lock-face (match-beginning 2)
836 (match-end 2)
837 c-reference-face-name))
838 (goto-char (match-end 1))))))))))
d9e94c22
MS
839
840 ;; Fontify the special declarations in Objective-C.
841 ,@(when (c-major-mode-is 'objc-mode)
842 `(;; Fontify class names in the beginning of message expressions.
843 ,(c-make-font-lock-search-function
844 "\\["
845 '((c-fontify-types-and-refs ()
846 (c-forward-syntactic-ws limit)
847 (let ((start (point)))
848 ;; In this case we accept both primitive and known types.
849 (when (eq (c-forward-type) 'known)
850 (goto-char start)
851 (let ((c-promote-possible-types t))
852 (c-forward-type))))
853 (if (> (point) limit) (goto-char limit)))))
854
855 ;; The @interface/@implementation/@protocol directives.
0386b551
AM
856 ,(c-make-font-lock-search-function
857 (concat "\\<"
858 (regexp-opt
d9e94c22
MS
859 '("@interface" "@implementation" "@protocol")
860 t)
861 "\\>")
0386b551
AM
862 '((c-fontify-types-and-refs
863 (;; The font-lock package in Emacs is known to clobber
864 ;; `parse-sexp-lookup-properties' (when it exists).
865 (parse-sexp-lookup-properties
866 (cc-eval-when-compile
867 (boundp 'parse-sexp-lookup-properties))))
868 (c-forward-objc-directive)
869 nil)
870 (goto-char (match-beginning 0))))))
871
872 (eval . (list "\\(!\\)[^=]" 1 c-negation-char-face-name))
d9e94c22
MS
873 ))
874
875(defun c-font-lock-complex-decl-prepare (limit)
1379f2c5
AM
876 ;; This function will be called from font-lock for a region bounded by POINT
877 ;; and LIMIT, as though it were to identify a keyword for
878 ;; font-lock-keyword-face. It always returns NIL to inhibit this and
879 ;; prevent a repeat invocation. See elisp/lispref page "Search-based
880 ;; Fontification".
881 ;;
d9e94c22 882 ;; Called before any of the matchers in `c-complex-decl-matchers'.
0386b551
AM
883 ;;
884 ;; This function does hidden buffer changes.
d9e94c22
MS
885
886 ;;(message "c-font-lock-complex-decl-prepare %s %s" (point) limit)
887
888 ;; Clear the list of found types if we start from the start of the
889 ;; buffer, to make it easier to get rid of misspelled types and
e15f8aaa 890 ;; variables that have gotten recognized as types in malformed code.
d9e94c22
MS
891 (when (bobp)
892 (c-clear-found-types))
893
e15f8aaa
AM
894 ;; Clear the c-type char properties which mark the region, to recalculate
895 ;; them properly. The most interesting properties are those put on the
896 ;; closest token before the region.
897 (save-excursion
898 (let ((pos (point)))
899 (c-backward-syntactic-ws)
900 (c-clear-char-properties
901 (if (and (not (bobp))
902 (memq (c-get-char-property (1- (point)) 'c-type)
903 '(c-decl-arg-start
904 c-decl-end
905 c-decl-id-start
906 c-decl-type-start)))
907 (1- (point))
908 pos)
909 limit 'c-type)))
d9e94c22
MS
910
911 ;; Update `c-state-cache' to the beginning of the region. This will
912 ;; make `c-beginning-of-syntax' go faster when it's used later on,
913 ;; and it's near the point most of the time.
914 (c-parse-state)
915
916 ;; Check if the fontified region starts inside a declarator list so
917 ;; that `c-font-lock-declarators' should be called at the start.
e15f8aaa
AM
918 ;; The declared identifiers are font-locked correctly as types, if
919 ;; that is what they are.
d9e94c22
MS
920 (let ((prop (save-excursion
921 (c-backward-syntactic-ws)
922 (unless (bobp)
923 (c-get-char-property (1- (point)) 'c-type)))))
924 (when (memq prop '(c-decl-id-start c-decl-type-start))
925 (c-forward-syntactic-ws limit)
926 (c-font-lock-declarators limit t (eq prop 'c-decl-type-start))))
927
b128268e
AM
928 (setq c-font-lock-context ;; (c-guess-font-lock-context)
929 (save-excursion
930 (if (and c-cpp-expr-intro-re
931 (c-beginning-of-macro)
932 (looking-at c-cpp-expr-intro-re))
933 'in-cpp-expr)))
d9e94c22
MS
934 nil)
935
936(defun c-font-lock-<>-arglists (limit)
1379f2c5
AM
937 ;; This function will be called from font-lock for a region bounded by POINT
938 ;; and LIMIT, as though it were to identify a keyword for
939 ;; font-lock-keyword-face. It always returns NIL to inhibit this and
940 ;; prevent a repeat invocation. See elisp/lispref page "Search-based
941 ;; Fontification".
942 ;;
d9e94c22 943 ;; Fontify types and references in names containing angle bracket
0386b551 944 ;; arglists from the point to LIMIT. Note that
1379f2c5 945 ;; `c-font-lock-declarations' already has handled many of them.
0386b551
AM
946 ;;
947 ;; This function might do hidden buffer changes.
d9e94c22
MS
948
949 (let (;; The font-lock package in Emacs is known to clobber
950 ;; `parse-sexp-lookup-properties' (when it exists).
951 (parse-sexp-lookup-properties
952 (cc-eval-when-compile
953 (boundp 'parse-sexp-lookup-properties)))
0386b551
AM
954 (c-parse-and-markup-<>-arglists t)
955 c-restricted-<>-arglists
956 id-start id-end id-face pos kwd-sym)
d9e94c22
MS
957
958 (while (and (< (point) limit)
959 (re-search-forward c-opt-<>-arglist-start limit t))
960
961 (setq id-start (match-beginning 1)
962 id-end (match-end 1)
963 pos (point))
964
965 (goto-char id-start)
966 (unless (c-skip-comments-and-strings limit)
0386b551
AM
967 (setq kwd-sym nil
968 c-restricted-<>-arglists nil
969 id-face (get-text-property id-start 'face))
970
971 (if (cond
972 ((eq id-face 'font-lock-type-face)
973 ;; The identifier got the type face so it has already been
974 ;; handled in `c-font-lock-declarations'.
975 nil)
976
977 ((eq id-face 'font-lock-keyword-face)
978 (when (looking-at c-opt-<>-sexp-key)
979 ;; There's a special keyword before the "<" that tells
980 ;; that it's an angle bracket arglist.
981 (setq kwd-sym (c-keyword-sym (match-string 1)))))
982
983 (t
984 ;; There's a normal identifier before the "<". If we're not in
985 ;; a declaration context then we set `c-restricted-<>-arglists'
986 ;; to avoid recognizing templates in function calls like "foo (a
987 ;; < b, c > d)".
988 (c-backward-syntactic-ws)
989 (when (and (memq (char-before) '(?\( ?,))
990 (not (eq (get-text-property (1- (point)) 'c-type)
991 'c-decl-arg-start)))
992 (setq c-restricted-<>-arglists t))
993 t))
994
d9e94c22
MS
995 (progn
996 (goto-char (1- pos))
997 ;; Check for comment/string both at the identifier and
998 ;; at the "<".
999 (unless (c-skip-comments-and-strings limit)
1000
0386b551
AM
1001 (c-fontify-types-and-refs ()
1002 (when (c-forward-<>-arglist (c-keyword-member
1003 kwd-sym 'c-<>-type-kwds))
1004 (when (and c-opt-identifier-concat-key
1005 (not (get-text-property id-start 'face)))
1006 (c-forward-syntactic-ws)
1007 (if (looking-at c-opt-identifier-concat-key)
1008 (c-put-font-lock-face id-start id-end
1009 c-reference-face-name)
d9e94c22 1010 (c-put-font-lock-face id-start id-end
0386b551 1011 'font-lock-type-face)))))
d9e94c22
MS
1012
1013 (goto-char pos)))
1014 (goto-char pos)))))
1015 nil)
1016
1017(defun c-font-lock-declarators (limit list types)
e15f8aaa
AM
1018 ;; Assuming the point is at the start of a declarator in a declaration,
1019 ;; fontify the identifier it declares. (If TYPES is set, it does this via
1020 ;; the macro `c-fontify-types-and-refs'.)
1021 ;;
1022 ;; If LIST is non-nil, also fontify the ids in any following declarators in
1023 ;; a comma separated list (e.g. "foo" and "*bar" in "int foo = 17, *bar;");
1024 ;; additionally, mark the commas with c-type property 'c-decl-id-start or
1025 ;; 'c-decl-type-start (according to TYPES). Stop at LIMIT.
1026 ;;
1027 ;; If TYPES is non-nil, fontify all identifiers as types.
1028 ;;
1029 ;; Nil is always returned. The function leaves point at the delimiter after
1030 ;; the last declarator it processes.
0386b551
AM
1031 ;;
1032 ;; This function might do hidden buffer changes.
d9e94c22
MS
1033
1034 ;;(message "c-font-lock-declarators from %s to %s" (point) limit)
1035 (c-fontify-types-and-refs
1036 ((pos (point)) next-pos id-start id-end
1037 paren-depth
1038 id-face got-init
1039 c-last-identifier-range
1040 (separator-prop (if types 'c-decl-type-start 'c-decl-id-start)))
1041
e15f8aaa
AM
1042 ;; The following `while' fontifies a single declarator id each time round.
1043 ;; It loops only when LIST is non-nil.
1044 (while
1045 ;; Inside the following "condition form", we move forward over the
1046 ;; declarator's identifier up as far as any opening bracket (for array
1047 ;; size) or paren (for parameters of function-type) or brace (for
e1dbe924 1048 ;; array/struct initialization) or "=" or terminating delimiter
e15f8aaa
AM
1049 ;; (e.g. "," or ";" or "}").
1050 (and
d9e94c22
MS
1051 pos
1052 (< (point) limit)
1053
e15f8aaa
AM
1054 ;; The following form moves forward over the declarator's
1055 ;; identifier (and what precedes it), returning t. If there
1056 ;; wasn't one, it returns nil, terminating the `while'.
d9e94c22
MS
1057 (let (got-identifier)
1058 (setq paren-depth 0)
e15f8aaa
AM
1059 ;; Skip over type decl prefix operators, one for each iteration
1060 ;; of the while. These are, e.g. "*" in "int *foo" or "(" and
1061 ;; "*" in "int (*foo) (void)" (Note similar code in
1062 ;; `c-forward-decl-or-cast-1'.)
d9e94c22
MS
1063 (while (and (looking-at c-type-decl-prefix-key)
1064 (if (and (c-major-mode-is 'c++-mode)
e15f8aaa
AM
1065 (match-beginning 3))
1066 ;; If the third submatch matches in C++ then
d9e94c22
MS
1067 ;; we're looking at an identifier that's a
1068 ;; prefix only if it specifies a member pointer.
1069 (progn
1070 (setq id-start (point))
1071 (c-forward-name)
1072 (if (looking-at "\\(::\\)")
1073 ;; We only check for a trailing "::" and
1074 ;; let the "*" that should follow be
1075 ;; matched in the next round.
1076 t
1077 ;; It turned out to be the real identifier,
1078 ;; so flag that and stop.
1079 (setq got-identifier t)
1080 nil))
1081 t))
1082 (if (eq (char-after) ?\()
1083 (progn
1084 (setq paren-depth (1+ paren-depth))
1085 (forward-char))
1086 (goto-char (match-end 1)))
1087 (c-forward-syntactic-ws))
1088
e15f8aaa 1089 ;; If we haven't passed the identifier already, do it now.
d9e94c22
MS
1090 (unless got-identifier
1091 (setq id-start (point))
1092 (c-forward-name))
1093 (setq id-end (point))
1094
1095 (/= id-end pos))
1096
e15f8aaa
AM
1097 ;; Skip out of the parens surrounding the identifier. If closing
1098 ;; parens are missing, this form returns nil.
d9e94c22
MS
1099 (or (= paren-depth 0)
1100 (c-safe (goto-char (scan-lists (point) 1 paren-depth))))
1101
1102 (<= (point) limit)
1103
e15f8aaa 1104 ;; Skip over any trailing bit, such as "__attribute__".
0386b551
AM
1105 (progn
1106 (when (looking-at c-decl-hangon-key)
1107 (c-forward-keyword-clause 1))
1108 (<= (point) limit))
1109
d9e94c22 1110 ;; Search syntactically to the end of the declarator (";",
da6062e6 1111 ;; ",", a closing paren, eob etc) or to the beginning of an
2a15eb73
MS
1112 ;; initializer or function prototype ("=" or "\\s\(").
1113 ;; Note that the open paren will match array specs in
1114 ;; square brackets, and we treat them as initializers too.
d9e94c22 1115 (c-syntactic-re-search-forward
2a15eb73 1116 "[;,]\\|\\s)\\|\\'\\|\\(=\\|\\s(\\)" limit t t))
d9e94c22
MS
1117
1118 (setq next-pos (match-beginning 0)
39f7186c
CY
1119 id-face (if (and (eq (char-after next-pos) ?\()
1120 (let (c-last-identifier-range)
1121 (save-excursion
1122 (goto-char next-pos)
1123 (c-at-toplevel-p))))
d9e94c22
MS
1124 'font-lock-function-name-face
1125 'font-lock-variable-name-face)
2a15eb73
MS
1126 got-init (and (match-beginning 1)
1127 (char-after (match-beginning 1))))
d9e94c22
MS
1128
1129 (if types
53964682 1130 ;; Register and fontify the identifier as a type.
d9e94c22
MS
1131 (let ((c-promote-possible-types t))
1132 (goto-char id-start)
1133 (c-forward-type))
1134 ;; Fontify the last symbol in the identifier if it isn't fontified
1135 ;; already. The check is necessary only in certain cases where this
1136 ;; function is used "sloppily", e.g. in `c-simple-decl-matchers'.
1137 (when (and c-last-identifier-range
1138 (not (get-text-property (car c-last-identifier-range)
1139 'face)))
1140 (c-put-font-lock-face (car c-last-identifier-range)
1141 (cdr c-last-identifier-range)
1142 id-face)))
1143
1144 (goto-char next-pos)
e15f8aaa 1145 (setq pos nil) ; So as to terminate the enclosing `while' form.
d9e94c22
MS
1146 (when list
1147 ;; Jump past any initializer or function prototype to see if
1148 ;; there's a ',' to continue at.
1149
1150 (cond ((eq id-face 'font-lock-function-name-face)
1151 ;; Skip a parenthesized initializer (C++) or a function
1152 ;; prototype.
e15f8aaa 1153 (if (c-safe (c-forward-sexp 1) t) ; over the parameter list.
d9e94c22 1154 (c-forward-syntactic-ws limit)
e15f8aaa 1155 (goto-char limit))) ; unbalanced parens
d9e94c22 1156
e15f8aaa 1157 (got-init ; "=" sign OR opening "(", "[", or "{"
2a15eb73
MS
1158 ;; Skip an initializer expression. If we're at a '='
1159 ;; then accept a brace list directly after it to cope
1160 ;; with array initializers. Otherwise stop at braces
1161 ;; to avoid going past full function and class blocks.
1162 (and (if (and (eq got-init ?=)
3efc2cd7 1163 (= (c-forward-token-2 1 nil limit) 0)
2a15eb73 1164 (looking-at "{"))
e15f8aaa 1165 (c-safe (c-forward-sexp) t) ; over { .... }
2a15eb73 1166 t)
0386b551
AM
1167 ;; FIXME: Should look for c-decl-end markers here;
1168 ;; we might go far into the following declarations
1169 ;; in e.g. ObjC mode (see e.g. methods-4.m).
2a15eb73
MS
1170 (c-syntactic-re-search-forward "[;,{]" limit 'move t)
1171 (backward-char)))
d9e94c22
MS
1172
1173 (t (c-forward-syntactic-ws limit)))
1174
1175 ;; If a ',' is found we set pos to the next declarator and iterate.
1176 (when (and (< (point) limit) (looking-at ","))
1177 (c-put-char-property (point) 'c-type separator-prop)
1178 (forward-char)
1179 (c-forward-syntactic-ws limit)
e15f8aaa 1180 (setq pos (point)))))) ; acts to make the `while' form continue.
d9e94c22
MS
1181 nil)
1182
1183(defconst c-font-lock-maybe-decl-faces
1184 ;; List of faces that might be put at the start of a type when
1185 ;; `c-font-lock-declarations' runs. This needs to be evaluated to
1186 ;; ensure that face name aliases in Emacs are resolved.
1187 (list nil
1188 font-lock-type-face
1189 c-reference-face-name
1190 font-lock-keyword-face))
1191
d9e94c22 1192(defun c-font-lock-declarations (limit)
e15f8aaa
AM
1193 ;; Fontify all the declarations, casts and labels from the point to LIMIT.
1194 ;; Assumes that strings and comments have been fontified already.
1195 ;;
1379f2c5
AM
1196 ;; This function will be called from font-lock for a region bounded by POINT
1197 ;; and LIMIT, as though it were to identify a keyword for
1198 ;; font-lock-keyword-face. It always returns NIL to inhibit this and
1199 ;; prevent a repeat invocation. See elisp/lispref page "Search-based
1200 ;; Fontification".
1201 ;;
0386b551 1202 ;; This function might do hidden buffer changes.
d9e94c22
MS
1203
1204 ;;(message "c-font-lock-declarations search from %s to %s" (point) limit)
1205
1206 (save-restriction
e15f8aaa 1207 (let (;; The position where `c-find-decl-spots' last stopped.
0386b551 1208 start-pos
e15f8aaa
AM
1209 ;; o - 'decl if we're in an arglist containing declarations
1210 ;; (but if `c-recognize-paren-inits' is set it might also be
1211 ;; an initializer arglist);
1212 ;; o - '<> if the arglist is of angle bracket type;
1213 ;; o - 'arglist if it's some other arglist;
1214 ;; o - nil, if not in an arglist at all. This includes the
333f9019 1215 ;; parenthesized condition which follows "if", "while", etc.
0386b551
AM
1216 context
1217 ;; The position of the next token after the closing paren of
1218 ;; the last detected cast.
d9e94c22 1219 last-cast-end
0386b551
AM
1220 ;; The result from `c-forward-decl-or-cast-1'.
1221 decl-or-cast
1222 ;; The maximum of the end positions of all the checked type
1223 ;; decl expressions in the successfully identified
1224 ;; declarations. The position might be either before or
1225 ;; after the syntactic whitespace following the last token
1226 ;; in the type decl expression.
d9e94c22
MS
1227 (max-type-decl-end 0)
1228 ;; Same as `max-type-decl-*', but used when we're before
1229 ;; `token-pos'.
1230 (max-type-decl-end-before-token 0)
0386b551
AM
1231 ;; Set according to the context to direct the heuristics for
1232 ;; recognizing C++ templates.
1233 c-restricted-<>-arglists
1234 ;; Turn on recording of identifier ranges in
1235 ;; `c-forward-decl-or-cast-1' and `c-forward-label' for
1236 ;; later fontification.
1237 (c-record-type-identifiers t)
1379f2c5 1238 label-type
d9e94c22 1239 c-record-ref-identifiers
0386b551
AM
1240 ;; Make `c-forward-type' calls mark up template arglists if
1241 ;; it finds any. That's necessary so that we later will
1242 ;; stop inside them to fontify types there.
1243 (c-parse-and-markup-<>-arglists t)
9657183b 1244 lbrace ; position of some {.
d9e94c22
MS
1245 ;; The font-lock package in Emacs is known to clobber
1246 ;; `parse-sexp-lookup-properties' (when it exists).
1247 (parse-sexp-lookup-properties
1248 (cc-eval-when-compile
1249 (boundp 'parse-sexp-lookup-properties))))
1250
1251 ;; Below we fontify a whole declaration even when it crosses the limit,
abfc152b 1252 ;; to avoid gaps when jit/lazy-lock fontifies the file a block at a
d9e94c22
MS
1253 ;; time. That is however annoying during editing, e.g. the following is
1254 ;; a common situation while the first line is being written:
1255 ;;
1256 ;; my_variable
1257 ;; some_other_variable = 0;
1258 ;;
1259 ;; font-lock will put the limit at the beginning of the second line
1260 ;; here, and if we go past it we'll fontify "my_variable" as a type and
1261 ;; "some_other_variable" as an identifier, and the latter will not
1262 ;; correct itself until the second line is changed. To avoid that we
1263 ;; narrow to the limit if the region to fontify is a single line.
abfc152b
AM
1264 (if (<= limit (c-point 'bonl))
1265 (narrow-to-region
1266 (point-min)
0386b551
AM
1267 (save-excursion
1268 ;; Narrow after any operator chars following the limit though,
1269 ;; since those characters can be useful in recognizing a
1270 ;; declaration (in particular the '{' that opens a function body
1271 ;; after the header).
1272 (goto-char limit)
1273 (skip-chars-forward c-nonsymbol-chars)
abfc152b 1274 (point))))
d9e94c22
MS
1275
1276 (c-find-decl-spots
1277 limit
0386b551 1278 c-decl-start-re
d9e94c22
MS
1279 c-font-lock-maybe-decl-faces
1280
1281 (lambda (match-pos inside-macro)
0386b551
AM
1282 (setq start-pos (point))
1283 (when
1284 ;; The result of the form below is true when we don't recognize a
1285 ;; declaration or cast.
536610a4
AM
1286 (if (or (and (eq (get-text-property (point) 'face)
1287 'font-lock-keyword-face)
1288 (looking-at c-not-decl-init-keywords))
1289 (and c-macro-with-semi-re
1290 (looking-at c-macro-with-semi-re))) ; 2008-11-04
0386b551
AM
1291 ;; Don't do anything more if we're looking at a keyword that
1292 ;; can't start a declaration.
1293 t
1294
e15f8aaa
AM
1295 ;; Set `context' and `c-restricted-<>-arglists'. Look for
1296 ;; "<" for the sake of C++-style template arglists.
1297 ;; Ignore "(" when it's part of a control flow construct
1298 ;; (e.g. "for (").
1299 (let ((type (and (> match-pos (point-min))
1300 (c-get-char-property (1- match-pos) 'c-type))))
1301 (cond ((not (memq (char-before match-pos) '(?\( ?, ?\[ ?<)))
1302 (setq context nil
1303 c-restricted-<>-arglists nil))
1304 ;; A control flow expression
1305 ((and (eq (char-before match-pos) ?\()
1306 (save-excursion
1307 (goto-char match-pos)
1308 (backward-char)
1309 (c-backward-token-2)
1310 (looking-at c-block-stmt-2-key)))
1311 (setq context nil
1312 c-restricted-<>-arglists t))
1313 ;; Near BOB.
1314 ((<= match-pos (point-min))
1315 (setq context 'arglist
1316 c-restricted-<>-arglists t))
1317 ;; Got a cached hit in a declaration arglist.
1318 ((eq type 'c-decl-arg-start)
1319 (setq context 'decl
1320 c-restricted-<>-arglists nil))
1321 ;; Inside an angle bracket arglist.
1322 ((or (eq type 'c-<>-arg-sep)
1323 (eq (char-before match-pos) ?<))
1324 (setq context '<>
1325 c-restricted-<>-arglists nil))
1326 ;; Got a cached hit in some other type of arglist.
1327 (type
1328 (setq context 'arglist
1329 c-restricted-<>-arglists t))
1330 ((if inside-macro
1331 (< match-pos max-type-decl-end-before-token)
1332 (< match-pos max-type-decl-end))
1333 ;; The point is within the range of a previously
1334 ;; encountered type decl expression, so the arglist
1335 ;; is probably one that contains declarations.
1336 ;; However, if `c-recognize-paren-inits' is set it
1337 ;; might also be an initializer arglist.
1338 (setq context 'decl
1339 c-restricted-<>-arglists nil)
1340 ;; The result of this check is cached with a char
1341 ;; property on the match token, so that we can look
1342 ;; it up again when refontifying single lines in a
1343 ;; multiline declaration.
1344 (c-put-char-property (1- match-pos)
1345 'c-type 'c-decl-arg-start))
1346 (t (setq context 'arglist
1347 c-restricted-<>-arglists t))))
1348
1349 ;; Check we haven't missed a preceding "typedef".
1350 (when (not (looking-at c-typedef-key))
1351 (c-backward-syntactic-ws)
1352 (c-backward-token-2)
1353 (or (looking-at c-typedef-key)
1354 (goto-char start-pos)))
1355
b248a85d
AM
1356 ;; In QT, "more" is an irritating keyword that expands to nothing.
1357 ;; We skip over it to prevent recognition of "more slots: <symbol>"
1358 ;; as a bitfield declaration.
1359 (when (and (c-major-mode-is 'c++-mode)
1360 (looking-at
1361 (concat "\\(more\\)\\([^" c-symbol-chars "]\\|$\\)")))
1362 (goto-char (match-end 1))
1363 (c-forward-syntactic-ws))
9657183b
AM
1364
1365 ;; Now analyze the construct.
e15f8aaa 1366 (setq decl-or-cast (c-forward-decl-or-cast-1
0386b551
AM
1367 match-pos context last-cast-end))
1368
8c0e3589
AM
1369 (cond
1370 ((eq decl-or-cast 'cast)
1371 ;; Save the position after the previous cast so we can feed
1372 ;; it to `c-forward-decl-or-cast-1' in the next round. That
1373 ;; helps it discover cast chains like "(a) (b) c".
1374 (setq last-cast-end (point))
1375 (c-fontify-recorded-types-and-refs)
1376 nil)
10f5e3e6 1377
8c0e3589
AM
1378 (decl-or-cast
1379 ;; We've found a declaration.
1380
1381 ;; Set `max-type-decl-end' or `max-type-decl-end-before-token'
1382 ;; under the assumption that we're after the first type decl
1383 ;; expression in the declaration now. That's not really true;
1384 ;; we could also be after a parenthesized initializer
1385 ;; expression in C++, but this is only used as a last resort
1386 ;; to slant ambiguous expression/declarations, and overall
1387 ;; it's worth the risk to occasionally fontify an expression
1388 ;; as a declaration in an initializer expression compared to
1389 ;; getting ambiguous things in normal function prototypes
1390 ;; fontified as expressions.
1391 (if inside-macro
1392 (when (> (point) max-type-decl-end-before-token)
1393 (setq max-type-decl-end-before-token (point)))
1394 (when (> (point) max-type-decl-end)
1395 (setq max-type-decl-end (point))))
1396
1397 ;; Back up to the type to fontify the declarator(s).
1398 (goto-char (car decl-or-cast))
1399
1400 (let ((decl-list
1401 (if context
1402 ;; Should normally not fontify a list of
1403 ;; declarators inside an arglist, but the first
1404 ;; argument in the ';' separated list of a "for"
1405 ;; statement is an exception.
1406 (when (eq (char-before match-pos) ?\()
1407 (save-excursion
1408 (goto-char (1- match-pos))
1409 (c-backward-syntactic-ws)
1410 (and (c-simple-skip-symbol-backward)
1411 (looking-at c-paren-stmt-key))))
1412 t)))
1413
1414 ;; Fix the `c-decl-id-start' or `c-decl-type-start' property
1415 ;; before the first declarator if it's a list.
1416 ;; `c-font-lock-declarators' handles the rest.
1417 (when decl-list
e15f8aaa 1418 (save-excursion
8c0e3589
AM
1419 (c-backward-syntactic-ws)
1420 (unless (bobp)
1421 (c-put-char-property (1- (point)) 'c-type
1422 (if (cdr decl-or-cast)
1423 'c-decl-type-start
1424 'c-decl-id-start)))))
1425
1426 (c-font-lock-declarators
1427 (point-max) decl-list (cdr decl-or-cast)))
1428
1429 ;; A declaration has been successfully identified, so do all the
1430 ;; fontification of types and refs that've been recorded.
0386b551 1431 (c-fontify-recorded-types-and-refs)
8c0e3589
AM
1432 nil)
1433
9657183b
AM
1434 ;; Restore point, since at this point in the code it has been
1435 ;; left undefined by c-forward-decl-or-cast-1 above.
1436 ((progn (goto-char start-pos) nil))
1437
1438 ;; If point is inside a bracelist, there's no point checking it
1439 ;; being at a declarator.
1440 ((let ((paren-state (c-parse-state)))
1441 (setq lbrace (c-cheap-inside-bracelist-p paren-state)))
1442 ;; Move past this bracelist to prevent an endless loop.
1443 (goto-char lbrace)
1444 (unless (c-safe (progn (forward-list) t))
1445 (goto-char start-pos)
1446 (c-forward-token-2))
1447 nil)
1448
1449 ;; If point is just after a ")" which is followed by an
1450 ;; identifier which isn't a label, or at the matching "(", we're
1451 ;; at either a macro invocation, a cast, or a
1452 ;; for/while/etc. statement. The cast case is handled above.
1453 ;; None of these cases can contain a declarator.
1454 ((or (and (eq (char-before match-pos) ?\))
1455 (c-on-identifier)
1456 (save-excursion (not (c-forward-label))))
1457 (and (eq (char-after) ?\()
1458 (save-excursion
1459 (and
1460 (progn (c-backward-token-2) (c-on-identifier))
1461 (save-excursion (not (c-forward-label)))
1462 (progn (c-backward-token-2)
1463 (eq (char-after) ?\())))))
1464 (c-forward-token-2) ; Must prevent looping.
1465 nil)
1466
9d5a8f0b 1467 ((and (not c-enums-contain-decls)
27e428e7 1468 ;; An optimization quickly to eliminate scans of long enum
9d5a8f0b
AM
1469 ;; declarations in the next cond arm.
1470 (let ((paren-state (c-parse-state)))
1471 (and
1472 (numberp (car paren-state))
1473 (save-excursion
1474 (goto-char (car paren-state))
1475 (c-backward-token-2)
1476 (or (looking-at c-brace-list-key)
1477 (progn
1478 (c-backward-token-2)
1479 (looking-at c-brace-list-key)))))))
9657183b
AM
1480 (c-forward-token-2)
1481 nil)
9d5a8f0b 1482
8c0e3589
AM
1483 (t
1484 ;; Are we at a declarator? Try to go back to the declaration
1485 ;; to check this. If we get there, check whether a "typedef"
1486 ;; is there, then fontify the declarators accordingly.
9657183b 1487 (let ((decl-search-lim (c-determine-limit 1000))
7d0ee75c 1488 paren-state bod-res encl-pos is-typedef
8c0e3589
AM
1489 c-recognize-knr-p) ; Strictly speaking, bogus, but it
1490 ; speeds up lisp.h tremendously.
1491 (save-excursion
1492 (setq bod-res (car (c-beginning-of-decl-1 decl-search-lim)))
1493 (if (and (eq bod-res 'same)
1494 (progn
1495 (c-backward-syntactic-ws)
1496 (eq (char-before) ?\})))
1497 (c-beginning-of-decl-1 decl-search-lim))
1498
1499 ;; We're now putatively at the declaration.
1500 (setq paren-state (c-parse-state))
1501 ;; At top level or inside a "{"?
1502 (if (or (not (setq encl-pos
1503 (c-most-enclosing-brace paren-state)))
1504 (eq (char-after encl-pos) ?\{))
1505 (progn
1506 (when (looking-at c-typedef-key) ; "typedef"
1507 (setq is-typedef t)
1508 (goto-char (match-end 0))
1509 (c-forward-syntactic-ws))
1510 ;; At a real declaration?
1511 (if (memq (c-forward-type t) '(t known found))
1512 (progn
1513 (c-font-lock-declarators limit t is-typedef)
1514 nil)
1515 ;; False alarm. Return t to go on to the next check.
1516 (goto-char start-pos)
1517 t))
1518 t))))))
0386b551 1519
1379f2c5
AM
1520 ;; It was a false alarm. Check if we're in a label (or other
1521 ;; construct with `:' except bitfield) instead.
0386b551 1522 (goto-char start-pos)
1379f2c5
AM
1523 (when (setq label-type (c-forward-label t match-pos nil))
1524 ;; Can't use `c-fontify-types-and-refs' here since we
1525 ;; use the label face at times.
1526 (cond ((eq label-type 'goto-target)
1527 (c-put-font-lock-face (caar c-record-ref-identifiers)
1528 (cdar c-record-ref-identifiers)
1529 c-label-face-name))
1530 ((eq label-type 'qt-1kwd-colon)
1531 (c-put-font-lock-face (caar c-record-ref-identifiers)
1532 (cdar c-record-ref-identifiers)
1533 'font-lock-keyword-face))
1534 ((eq label-type 'qt-2kwds-colon)
1535 (mapc
1536 (lambda (kwd)
1537 (c-put-font-lock-face (car kwd) (cdr kwd)
1538 'font-lock-keyword-face))
1539 c-record-ref-identifiers)))
1540 (setq c-record-ref-identifiers nil)
1541 ;; `c-forward-label' has probably added a `c-decl-end'
1542 ;; marker, so return t to `c-find-decl-spots' to signal
1543 ;; that.
1544 t))))
d9e94c22
MS
1545
1546 nil)))
1547
4f9e41e4
AM
1548(defun c-font-lock-enum-tail (limit)
1549 ;; Fontify an enum's identifiers when POINT is within the enum's brace
1550 ;; block.
1551 ;;
1552 ;; This function will be called from font-lock for a region bounded by POINT
1553 ;; and LIMIT, as though it were to identify a keyword for
1554 ;; font-lock-keyword-face. It always returns NIL to inhibit this and
1555 ;; prevent a repeat invocation. See elisp/lispref page "Search-based
1556 ;; Fontification".
1557 ;;
1558 ;; Note that this function won't attempt to fontify beyond the end of the
1559 ;; current enum block, if any.
1560 (let* ((paren-state (c-parse-state))
1561 (encl-pos (c-most-enclosing-brace paren-state))
1562 (start (point))
1563 )
1564 (when (and
1565 encl-pos
1566 (eq (char-after encl-pos) ?\{)
1567 (save-excursion
1568 (goto-char encl-pos)
1569 (c-backward-syntactic-ws)
1570 (c-simple-skip-symbol-backward)
1571 (or (looking-at c-brace-list-key) ; "enum"
1572 (progn (c-backward-syntactic-ws)
1573 (c-simple-skip-symbol-backward)
1574 (looking-at c-brace-list-key)))))
1575 (c-syntactic-skip-backward "^{," nil t)
1576 (c-put-char-property (1- (point)) 'c-type 'c-decl-id-start)
1577
1578 (c-forward-syntactic-ws)
1579 (c-font-lock-declarators limit t nil)))
1580 nil)
1581
bf2c1571
AM
1582(defun c-font-lock-enclosing-decls (limit)
1583 ;; Fontify the declarators of (nested) declarations we're in the middle of.
1584 ;; This is mainly for when a jit-lock etc. chunk starts inside the brace
1585 ;; block of a struct/union/class, etc.
7d0ee75c 1586 ;;
bf2c1571
AM
1587 ;; This function will be called from font-lock for a region bounded by POINT
1588 ;; and LIMIT, as though it were to identify a keyword for
1589 ;; font-lock-keyword-face. It always returns NIL to inhibit this and
1590 ;; prevent a repeat invocation. See elisp/lispref page "Search-based
1591 ;; Fontification".
1592 (let* ((paren-state (c-parse-state))
3f6b93cd 1593 (decl-search-lim (c-determine-limit 1000))
cb5e207c
AM
1594 decl-context in-typedef ps-elt)
1595 ;; Are we in any nested struct/union/class/etc. braces?
bf2c1571
AM
1596 (while paren-state
1597 (setq ps-elt (car paren-state)
1598 paren-state (cdr paren-state))
1599 (when (and (atom ps-elt)
1600 (eq (char-after ps-elt) ?\{))
1601 (goto-char ps-elt)
3f6b93cd 1602 (setq decl-context (c-beginning-of-decl-1 decl-search-lim)
bf2c1571
AM
1603 in-typedef (looking-at c-typedef-key))
1604 (if in-typedef (c-forward-token-2))
ff7271b9
OT
1605 (when (and c-opt-block-decls-with-vars-key
1606 (looking-at c-opt-block-decls-with-vars-key))
bf2c1571
AM
1607 (goto-char ps-elt)
1608 (when (c-safe (c-forward-sexp))
1609 (c-forward-syntactic-ws)
1610 (c-font-lock-declarators limit t in-typedef)))))))
7d0ee75c 1611
d9e94c22
MS
1612(c-lang-defconst c-simple-decl-matchers
1613 "Simple font lock matchers for types and declarations. These are used
1614on level 2 only and so aren't combined with `c-complex-decl-matchers'."
1615
1616 t `(;; Objective-C methods.
1617 ,@(when (c-major-mode-is 'objc-mode)
1618 `((,(c-lang-const c-opt-method-key)
1619 (,(byte-compile
1620 (lambda (limit)
1621 (let (;; The font-lock package in Emacs is known to clobber
1622 ;; `parse-sexp-lookup-properties' (when it exists).
1623 (parse-sexp-lookup-properties
1624 (cc-eval-when-compile
1625 (boundp 'parse-sexp-lookup-properties))))
1626 (save-restriction
1627 (narrow-to-region (point-min) limit)
1628 (c-font-lock-objc-method)))
1629 nil))
1630 (goto-char (match-end 1))))))
1631
1632 ;; Fontify all type names and the identifiers in the
1633 ;; declarations they might start. Use eval here since
1634 ;; `c-known-type-key' gets its value from
1635 ;; `*-font-lock-extra-types' on mode init.
1636 (eval . (list ,(c-make-font-lock-search-function
1637 'c-known-type-key
1638 '(1 'font-lock-type-face t)
1639 '((c-font-lock-declarators limit t nil)
1640 (save-match-data
1641 (goto-char (match-end 1))
1642 (c-forward-syntactic-ws))
1643 (goto-char (match-end 1))))))
1644
1645 ;; Fontify types preceded by `c-type-prefix-kwds' and the
1646 ;; identifiers in the declarations they might start.
1647 ,@(when (c-lang-const c-type-prefix-kwds)
0386b551
AM
1648 (let* ((prefix-re (c-make-keywords-re nil
1649 (c-lang-const c-type-prefix-kwds)))
1650 (type-match (+ 2
1651 (regexp-opt-depth prefix-re)
1652 (c-lang-const c-simple-ws-depth))))
d9e94c22 1653 `((,(c-make-font-lock-search-function
0386b551
AM
1654 (concat "\\<\\(" prefix-re "\\)" ; 1
1655 (c-lang-const c-simple-ws) "+"
1656 (concat "\\(" ; 2 + prefix-re + c-simple-ws
1657 (c-lang-const c-symbol-key)
1658 "\\)"))
1659 `(,type-match
d9e94c22 1660 'font-lock-type-face t)
0386b551 1661 `((c-font-lock-declarators limit t nil)
d9e94c22 1662 (save-match-data
0386b551 1663 (goto-char (match-end ,type-match))
d9e94c22 1664 (c-forward-syntactic-ws))
0386b551 1665 (goto-char (match-end ,type-match))))))))
d9e94c22
MS
1666
1667 ;; Fontify special declarations that lacks a type.
1668 ,@(when (c-lang-const c-typeless-decl-kwds)
1669 `((,(c-make-font-lock-search-function
1670 (concat "\\<\\("
0386b551 1671 (regexp-opt (c-lang-const c-typeless-decl-kwds))
d9e94c22
MS
1672 "\\)\\>")
1673 '((c-font-lock-declarators limit t nil)
1674 (save-match-data
1675 (goto-char (match-end 1))
1676 (c-forward-syntactic-ws))
1677 (goto-char (match-end 1)))))))
0386b551
AM
1678
1679 ;; Fontify generic colon labels in languages that support them.
1680 ,@(when (c-lang-const c-recognize-colon-labels)
1681 `(c-font-lock-labels))))
d9e94c22
MS
1682
1683(c-lang-defconst c-complex-decl-matchers
1684 "Complex font lock matchers for types and declarations. Used on level
16853 and higher."
1686
e15f8aaa 1687 ;; Note: This code in this form dumps a number of functions into the
1379f2c5
AM
1688 ;; resulting constant, `c-matchers-3'. At run time, font lock will call
1689 ;; each of them as a "FUNCTION" (see Elisp page "Search-based
1690 ;; Fontification"). The font lock region is delimited by POINT and the
1691 ;; single parameter, LIMIT. Each of these functions returns NIL (thus
1692 ;; inhibiting spurious font-lock-keyword-face highlighting and another
1693 ;; call).
1694
d9e94c22
MS
1695 t `(;; Initialize some things before the search functions below.
1696 c-font-lock-complex-decl-prepare
1697
d9e94c22
MS
1698 ,@(if (c-major-mode-is 'objc-mode)
1699 ;; Fontify method declarations in Objective-C, but first
1700 ;; we have to put the `c-decl-end' `c-type' property on
1701 ;; all the @-style directives that haven't been handled in
1702 ;; `c-basic-matchers-before'.
1703 `(,(c-make-font-lock-search-function
1704 (c-make-keywords-re t
1705 ;; Exclude "@class" since that directive ends with a
1706 ;; semicolon anyway.
1707 (delete "@class"
1708 (append (c-lang-const c-protection-kwds)
1709 (c-lang-const c-other-decl-kwds)
1710 nil)))
1711 '((c-put-char-property (1- (match-end 1))
1712 'c-type 'c-decl-end)))
0386b551 1713 c-font-lock-objc-methods))
d9e94c22 1714
0386b551 1715 ;; Fontify all declarations, casts and normal labels.
d9e94c22
MS
1716 c-font-lock-declarations
1717
bf2c1571
AM
1718 ;; Fontify declarators when POINT is within their declaration.
1719 c-font-lock-enclosing-decls
1720
0386b551
AM
1721 ;; Fontify angle bracket arglists like templates in C++.
1722 ,@(when (c-lang-const c-recognize-<>-arglists)
1723 `(c-font-lock-<>-arglists))
1724
5a89f0a7 1725 ;; The first two rules here mostly find occurrences that
d9e94c22
MS
1726 ;; `c-font-lock-declarations' has found already, but not
1727 ;; declarations containing blocks in the type (see note below).
1728 ;; It's also useful to fontify these everywhere to show e.g. when
1729 ;; a type keyword is accidentally used as an identifier.
1730
1731 ;; Fontify basic types.
1732 ,(let ((re (c-make-keywords-re nil
1733 (c-lang-const c-primitive-type-kwds))))
1734 (if (c-major-mode-is 'pike-mode)
1735 ;; No symbol is a keyword after "->" in Pike.
0386b551 1736 `(,(concat "\\(\\=.?\\|[^>]\\|[^-]>\\)"
d9e94c22 1737 "\\<\\(" re "\\)\\>")
0386b551 1738 2 font-lock-type-face)
d9e94c22
MS
1739 `(,(concat "\\<\\(" re "\\)\\>")
1740 1 'font-lock-type-face)))
1741
e15f8aaa 1742 ;; Fontify types preceded by `c-type-prefix-kwds' (e.g. "struct").
d9e94c22
MS
1743 ,@(when (c-lang-const c-type-prefix-kwds)
1744 `((,(byte-compile
1745 `(lambda (limit)
1746 (c-fontify-types-and-refs
1747 ((c-promote-possible-types t)
1748 ;; The font-lock package in Emacs is known to clobber
1749 ;; `parse-sexp-lookup-properties' (when it exists).
1750 (parse-sexp-lookup-properties
1751 (cc-eval-when-compile
1752 (boundp 'parse-sexp-lookup-properties))))
1753 (save-restriction
1754 ;; Narrow to avoid going past the limit in
1755 ;; `c-forward-type'.
1756 (narrow-to-region (point) limit)
1757 (while (re-search-forward
1758 ,(concat "\\<\\("
1759 (c-make-keywords-re nil
1760 (c-lang-const c-type-prefix-kwds))
1761 "\\)\\>")
1762 limit t)
1763 (unless (c-skip-comments-and-strings limit)
1764 (c-forward-syntactic-ws)
1765 ;; Handle prefix declaration specifiers.
e3715033
AM
1766 (when (or (looking-at c-prefix-spec-kwds-re)
1767 (and (c-major-mode-is 'java-mode)
1768 (looking-at "@[A-Za-z0-9]+")))
0386b551 1769 (c-forward-keyword-clause 1))
d9e94c22
MS
1770 ,(if (c-major-mode-is 'c++-mode)
1771 `(when (and (c-forward-type)
1772 (eq (char-after) ?=))
1773 ;; In C++ we additionally check for a "class
1774 ;; X = Y" construct which is used in
1775 ;; templates, to fontify Y as a type.
1776 (forward-char)
1777 (c-forward-syntactic-ws)
1778 (c-forward-type))
1779 `(c-forward-type))
1780 )))))))))
1781
1782 ;; Fontify symbols after closing braces as declaration
1783 ;; identifiers under the assumption that they are part of
1784 ;; declarations like "class Foo { ... } foo;". It's too
1785 ;; expensive to check this accurately by skipping past the
1786 ;; brace block, so we use the heuristic that it's such a
1787 ;; declaration if the first identifier is on the same line as
1788 ;; the closing brace. `c-font-lock-declarations' will later
1789 ;; override it if it turns out to be an new declaration, but
1790 ;; it will be wrong if it's an expression (see the test
1791 ;; decls-8.cc).
e15f8aaa
AM
1792;; ,@(when (c-lang-const c-opt-block-decls-with-vars-key)
1793;; `((,(c-make-font-lock-search-function
1794;; (concat "}"
1795;; (c-lang-const c-single-line-syntactic-ws)
1796;; "\\(" ; 1 + c-single-line-syntactic-ws-depth
1797;; (c-lang-const c-type-decl-prefix-key)
1798;; "\\|"
1799;; (c-lang-const c-symbol-key)
1800;; "\\)")
1801;; `((c-font-lock-declarators limit t nil) ; That `nil' says use `font-lock-variable-name-face';
1802;; ; `t' would mean `font-lock-function-name-face'.
1803;; (progn
1804;; (c-put-char-property (match-beginning 0) 'c-type
1805;; 'c-decl-id-start)
1806;; ; 'c-decl-type-start)
1807;; (goto-char (match-beginning
1808;; ,(1+ (c-lang-const
1809;; c-single-line-syntactic-ws-depth)))))
1810;; (goto-char (match-end 0)))))))
d9e94c22
MS
1811
1812 ;; Fontify the type in C++ "new" expressions.
1813 ,@(when (c-major-mode-is 'c++-mode)
1379f2c5
AM
1814 ;; This pattern is a probably a "(MATCHER . ANCHORED-HIGHLIGHTER)"
1815 ;; (see Elisp page "Search-based Fontification").
d9e94c22
MS
1816 `(("\\<new\\>"
1817 (c-font-lock-c++-new))))
1818 ))
1819
1820(defun c-font-lock-labels (limit)
0386b551 1821 ;; Fontify all statement labels from the point to LIMIT. Assumes
d9e94c22
MS
1822 ;; that strings and comments have been fontified already. Nil is
1823 ;; always returned.
1824 ;;
0386b551
AM
1825 ;; Note: This function is only used on decoration level 2; this is
1826 ;; taken care of directly by the gargantuan
1827 ;; `c-font-lock-declarations' on higher levels.
1828 ;;
1829 ;; This function might do hidden buffer changes.
d9e94c22
MS
1830
1831 (let (continue-pos id-start
1832 ;; The font-lock package in Emacs is known to clobber
1833 ;; `parse-sexp-lookup-properties' (when it exists).
1834 (parse-sexp-lookup-properties
1835 (cc-eval-when-compile
1836 (boundp 'parse-sexp-lookup-properties))))
1837
1838 (while (re-search-forward ":[^:]" limit t)
1839 (setq continue-pos (point))
1840 (goto-char (match-beginning 0))
1841 (unless (c-skip-comments-and-strings limit)
1842
1843 (c-backward-syntactic-ws)
1844 (and (setq id-start (c-on-identifier))
1845
1846 (not (get-text-property id-start 'face))
1847
1848 (progn
1849 (goto-char id-start)
1850 (c-backward-syntactic-ws)
1851 (or
1852 ;; Check for a char that precedes a statement.
1853 (memq (char-before) '(?\} ?\{ ?\;))
1854 ;; Check for a preceding label. We exploit the font
1855 ;; locking made earlier by this function.
1856 (and (eq (char-before) ?:)
1857 (progn
1858 (backward-char)
1859 (c-backward-syntactic-ws)
1860 (not (bobp)))
1861 (eq (get-text-property (1- (point)) 'face)
1862 c-label-face-name))
1863 ;; Check for a keyword that precedes a statement.
1864 (c-after-conditional)))
1865
1866 (progn
1867 ;; Got a label.
1868 (goto-char id-start)
1869 (looking-at c-symbol-key)
1870 (c-put-font-lock-face (match-beginning 0) (match-end 0)
1871 c-label-face-name)))
1872
1873 (goto-char continue-pos))))
1874 nil)
1875
1876(c-lang-defconst c-basic-matchers-after
1877 "Font lock matchers for various things that should be fontified after
1878generic casts and declarations are fontified. Used on level 2 and
1879higher."
1880
4f9e41e4
AM
1881 t `(,@(when (c-lang-const c-brace-id-list-kwds)
1882 ;; Fontify the remaining identifiers inside an enum list when we start
1883 ;; inside it.
1884 `(c-font-lock-enum-tail
1885 ;; Fontify the identifiers inside enum lists. (The enum type
d9e94c22
MS
1886 ;; name is handled by `c-simple-decl-matchers' or
1887 ;; `c-complex-decl-matchers' below.
4f9e41e4 1888 (,(c-make-font-lock-search-function
d9e94c22
MS
1889 (concat
1890 "\\<\\("
1891 (c-make-keywords-re nil (c-lang-const c-brace-id-list-kwds))
1892 "\\)\\>"
1893 ;; Disallow various common punctuation chars that can't come
1894 ;; before the '{' of the enum list, to avoid searching too far.
1895 "[^\]\[{}();,/#=]*"
1896 "{")
1897 '((c-font-lock-declarators limit t nil)
1898 (save-match-data
1899 (goto-char (match-end 0))
1900 (c-put-char-property (1- (point)) 'c-type
1901 'c-decl-id-start)
1902 (c-forward-syntactic-ws))
1903 (goto-char (match-end 0)))))))
1904
0386b551
AM
1905 ;; Fontify labels after goto etc.
1906 ,@(when (c-lang-const c-before-label-kwds)
1907 `(;; (Got three different interpretation levels here,
d9e94c22
MS
1908 ;; which makes it a bit complicated: 1) The backquote
1909 ;; stuff is expanded when compiled or loaded, 2) the
1910 ;; eval form is evaluated at font-lock setup (to
1911 ;; substitute c-label-face-name correctly), and 3) the
1912 ;; resulting structure is interpreted during
1913 ;; fontification.)
1914 (eval
1915 . ,(let* ((c-before-label-re
1916 (c-make-keywords-re nil
1917 (c-lang-const c-before-label-kwds))))
1918 `(list
1919 ,(concat "\\<\\(" c-before-label-re "\\)\\>"
1920 "\\s *"
1921 "\\(" ; identifier-offset
1922 (c-lang-const c-symbol-key)
1923 "\\)")
0386b551
AM
1924 (list ,(+ (regexp-opt-depth c-before-label-re) 2)
1925 c-label-face-name nil t))))))
d9e94c22
MS
1926
1927 ;; Fontify the clauses after various keywords.
ef8cdf8c
AM
1928 ,@(when (or (c-lang-const c-type-list-kwds)
1929 (c-lang-const c-ref-list-kwds)
1930 (c-lang-const c-colon-type-list-kwds))
1931 `((,(c-make-font-lock-BO-decl-search-function
1932 (concat "\\<\\("
1933 (c-make-keywords-re nil
1934 (append (c-lang-const c-type-list-kwds)
1935 (c-lang-const c-ref-list-kwds)
1936 (c-lang-const c-colon-type-list-kwds)))
1937 "\\)\\>")
1938 '((c-fontify-types-and-refs ((c-promote-possible-types t))
1939 (c-forward-keyword-clause 1)
1940 (if (> (point) limit) (goto-char limit))))))))
1941
1942 ,@(when (c-lang-const c-paren-type-kwds)
1943 `((,(c-make-font-lock-search-function
1944 (concat "\\<\\("
1945 (c-make-keywords-re nil
1946 (c-lang-const c-paren-type-kwds))
1947 "\\)\\>")
1948 '((c-fontify-types-and-refs ((c-promote-possible-types t))
1949 (c-forward-keyword-clause 1)
1950 (if (> (point) limit) (goto-char limit))))))))
1951
1952 ,@(when (c-major-mode-is 'java-mode)
1953 `((eval . (list "\\<\\(@[a-zA-Z0-9]+\\)\\>" 1 c-annotation-face))))
d9e94c22
MS
1954 ))
1955
1956(c-lang-defconst c-matchers-1
1957 t (c-lang-const c-cpp-matchers))
1958
1959(c-lang-defconst c-matchers-2
1960 t (append (c-lang-const c-matchers-1)
1961 (c-lang-const c-basic-matchers-before)
1962 (c-lang-const c-simple-decl-matchers)
1963 (c-lang-const c-basic-matchers-after)))
1964
1965(c-lang-defconst c-matchers-3
1966 t (append (c-lang-const c-matchers-1)
1967 (c-lang-const c-basic-matchers-before)
1968 (c-lang-const c-complex-decl-matchers)
1969 (c-lang-const c-basic-matchers-after)))
1970
1971(defun c-compose-keywords-list (base-list)
1972 ;; Incorporate the font lock keyword lists according to
1973 ;; `c-doc-comment-style' on the given keyword list and return it.
1974 ;; This is used in the function bindings of the
1975 ;; `*-font-lock-keywords-*' symbols since we have to build the list
1976 ;; when font-lock is initialized.
1977
1978 (unless (memq c-doc-face-name c-literal-faces)
1979 (setq c-literal-faces (cons c-doc-face-name c-literal-faces)))
1980
1981 (let* ((doc-keywords
1982 (if (consp (car-safe c-doc-comment-style))
1983 (cdr-safe (or (assq c-buffer-is-cc-mode c-doc-comment-style)
1984 (assq 'other c-doc-comment-style)))
1985 c-doc-comment-style))
1986 (list (nconc (apply 'nconc
1987 (mapcar
1988 (lambda (doc-style)
1989 (let ((sym (intern
1990 (concat (symbol-name doc-style)
1991 "-font-lock-keywords"))))
1992 (cond ((fboundp sym)
1993 (funcall sym))
1994 ((boundp sym)
1995 (append (eval sym) nil)))))
1996 (if (listp doc-keywords)
1997 doc-keywords
1998 (list doc-keywords))))
1999 base-list)))
2000
2001 ;; Kludge: If `c-font-lock-complex-decl-prepare' is on the list we
2002 ;; move it first since the doc comment font lockers might add
7bfc3fdb 2003 ;; `c-type' text properties, so they have to be cleared before that.
d9e94c22
MS
2004 (when (memq 'c-font-lock-complex-decl-prepare list)
2005 (setq list (cons 'c-font-lock-complex-decl-prepare
2006 (delq 'c-font-lock-complex-decl-prepare
2007 (append list nil)))))
2008
2009 list))
2010
2011(defun c-override-default-keywords (def-var)
2012 ;; This is used to override the value on a `*-font-lock-keywords'
2013 ;; variable only if it's nil or has the same value as one of the
2014 ;; `*-font-lock-keywords-*' variables. Older font-lock packages
2015 ;; define a default value for `*-font-lock-keywords' which we want
2016 ;; to override, but we should otoh avoid clobbering a user setting.
2017 ;; This heuristic for that isn't perfect, but I can't think of any
2018 ;; better. /mast
d9e94c22
MS
2019 (when (and (boundp def-var)
2020 (memq (symbol-value def-var)
2021 (cons nil
2022 (mapcar
2023 (lambda (suffix)
2024 (let ((sym (intern (concat (symbol-name def-var)
2025 suffix))))
2026 (and (boundp sym) (symbol-value sym))))
2027 '("-1" "-2" "-3")))))
2028 ;; The overriding is done by unbinding the variable so that the normal
2029 ;; defvar will install its default value later on.
2030 (makunbound def-var)))
2031
2032\f
2033;;; C.
2034
2035(c-override-default-keywords 'c-font-lock-keywords)
2036
2037(defconst c-font-lock-keywords-1 (c-lang-const c-matchers-1 c)
2038 "Minimal font locking for C mode.
2039Fontifies only preprocessor directives (in addition to the syntactic
2040fontification of strings and comments).")
2041
2042(defconst c-font-lock-keywords-2 (c-lang-const c-matchers-2 c)
2043 "Fast normal font locking for C mode.
2044In addition to `c-font-lock-keywords-1', this adds fontification of
2045keywords, simple types, declarations that are easy to recognize, the
2046user defined types on `c-font-lock-extra-types', and the doc comment
2047styles specified by `c-doc-comment-style'.")
2048
2049(defconst c-font-lock-keywords-3 (c-lang-const c-matchers-3 c)
2050 "Accurate normal font locking for C mode.
9fc9a531 2051Like the variable `c-font-lock-keywords-2' but detects declarations in a more
d9e94c22
MS
2052accurate way that works in most cases for arbitrary types without the
2053need for `c-font-lock-extra-types'.")
2054
2055(defvar c-font-lock-keywords c-font-lock-keywords-3
2056 "Default expressions to highlight in C mode.")
2057
2058(defun c-font-lock-keywords-2 ()
2059 (c-compose-keywords-list c-font-lock-keywords-2))
2060(defun c-font-lock-keywords-3 ()
2061 (c-compose-keywords-list c-font-lock-keywords-3))
2062(defun c-font-lock-keywords ()
2063 (c-compose-keywords-list c-font-lock-keywords))
2064
2065\f
2066;;; C++.
2067
2068(defun c-font-lock-c++-new (limit)
e15f8aaa
AM
2069 ;; FIXME!!! Put in a comment about the context of this function's
2070 ;; invocation. I think it's called as an ANCHORED-MATCHER within an
2071 ;; ANCHORED-HIGHLIGHTER. (2007/2/10).
2072 ;;
d9e94c22
MS
2073 ;; Assuming point is after a "new" word, check that it isn't inside
2074 ;; a string or comment, and if so try to fontify the type in the
2075 ;; allocation expression. Nil is always returned.
2076 ;;
2077 ;; As usual, C++ takes the prize in coming up with a hard to parse
2078 ;; syntax. :P
0386b551
AM
2079 ;;
2080 ;; This function might do hidden buffer changes.
d9e94c22
MS
2081
2082 (unless (c-skip-comments-and-strings limit)
2083 (save-excursion
2084 (catch 'false-alarm
2085 ;; A "new" keyword is followed by one to three expressions, where
2086 ;; the type is the middle one, and the only required part.
2087 (let (expr1-pos expr2-pos
2088 ;; Enable recording of identifier ranges in `c-forward-type'
2089 ;; etc for later fontification. Not using
2090 ;; `c-fontify-types-and-refs' here since the ranges should
2091 ;; be fontified selectively only when an allocation
2092 ;; expression is successfully recognized.
2093 (c-record-type-identifiers t)
2094 c-record-ref-identifiers
2095 ;; The font-lock package in Emacs is known to clobber
2096 ;; `parse-sexp-lookup-properties' (when it exists).
2097 (parse-sexp-lookup-properties
2098 (cc-eval-when-compile
2099 (boundp 'parse-sexp-lookup-properties))))
2100 (c-forward-syntactic-ws)
2101
2102 ;; The first placement arglist is always parenthesized, if it
2103 ;; exists.
2104 (when (eq (char-after) ?\()
2105 (setq expr1-pos (1+ (point)))
2106 (condition-case nil
2107 (c-forward-sexp)
2108 (scan-error (throw 'false-alarm t)))
2109 (c-forward-syntactic-ws))
2110
2111 ;; The second expression is either a type followed by some "*" or
2112 ;; "[...]" or similar, or a parenthesized type followed by a full
2113 ;; identifierless declarator.
2114 (setq expr2-pos (1+ (point)))
2115 (cond ((eq (char-after) ?\())
2116 ((let ((c-promote-possible-types t))
2117 (c-forward-type)))
2118 (t (setq expr2-pos nil)))
2119
2120 (when expr1-pos
2121 (cond
2122 ((not expr2-pos)
2123 ;; No second expression, so the first has to be a
2124 ;; parenthesized type.
2125 (goto-char expr1-pos)
2126 (let ((c-promote-possible-types t))
2127 (c-forward-type)))
2128
2129 ((eq (char-before expr2-pos) ?\()
2130 ;; Got two parenthesized expressions, so we have to look
2131 ;; closer at them to decide which is the type. No need to
2132 ;; handle `c-record-ref-identifiers' since all references
2133 ;; has already been handled by other fontification rules.
2134 (let (expr1-res expr2-res)
2135
2136 (goto-char expr1-pos)
2137 (when (setq expr1-res (c-forward-type))
2138 (unless (looking-at
2139 (cc-eval-when-compile
2140 (concat (c-lang-const c-symbol-start c++)
2141 "\\|[*:\)\[]")))
2142 ;; There's something after the would-be type that
2143 ;; can't be there, so this is a placement arglist.
2144 (setq expr1-res nil)))
2145
2146 (goto-char expr2-pos)
2147 (when (setq expr2-res (c-forward-type))
2148 (unless (looking-at
2149 (cc-eval-when-compile
2150 (concat (c-lang-const c-symbol-start c++)
2151 "\\|[*:\)\[]")))
2152 ;; There's something after the would-be type that can't
2153 ;; be there, so this is an initialization expression.
2154 (setq expr2-res nil))
2155 (when (and (c-go-up-list-forward)
2156 (progn (c-forward-syntactic-ws)
2157 (eq (char-after) ?\()))
2158 ;; If there's a third initialization expression
2159 ;; then the second one is the type, so demote the
2160 ;; first match.
2161 (setq expr1-res nil)))
2162
2163 ;; We fontify the most likely type, with a preference for
2164 ;; the first argument since a placement arglist is more
2165 ;; unusual than an initializer.
2166 (cond ((memq expr1-res '(t known prefix)))
2167 ((memq expr2-res '(t known prefix)))
2168 ((eq expr1-res 'found)
2169 (let ((c-promote-possible-types t))
2170 (goto-char expr1-pos)
2171 (c-forward-type)))
2172 ((eq expr2-res 'found)
2173 (let ((c-promote-possible-types t))
2174 (goto-char expr2-pos)
2175 (c-forward-type)))
2176 ((and (eq expr1-res 'maybe) (not expr2-res))
2177 (let ((c-promote-possible-types t))
2178 (goto-char expr1-pos)
2179 (c-forward-type)))
2180 ((and (not expr1-res) (eq expr2-res 'maybe))
2181 (let ((c-promote-possible-types t))
2182 (goto-char expr2-pos)
2183 (c-forward-type)))
2184 ;; If both type matches are 'maybe then we're
2185 ;; too uncertain to promote either of them.
2186 )))))
2187
2188 ;; Fontify the type that now is recorded in
2189 ;; `c-record-type-identifiers', if any.
2190 (c-fontify-recorded-types-and-refs)))))
2191 nil)
2192
2193(c-override-default-keywords 'c++-font-lock-keywords)
2194
2195(defconst c++-font-lock-keywords-1 (c-lang-const c-matchers-1 c++)
2196 "Minimal font locking for C++ mode.
2197Fontifies only preprocessor directives (in addition to the syntactic
2198fontification of strings and comments).")
2199
2200(defconst c++-font-lock-keywords-2 (c-lang-const c-matchers-2 c++)
2201 "Fast normal font locking for C++ mode.
2202In addition to `c++-font-lock-keywords-1', this adds fontification of
2203keywords, simple types, declarations that are easy to recognize, the
2204user defined types on `c++-font-lock-extra-types', and the doc comment
2205styles specified by `c-doc-comment-style'.")
2206
2207(defconst c++-font-lock-keywords-3 (c-lang-const c-matchers-3 c++)
2208 "Accurate normal font locking for C++ mode.
9fc9a531 2209Like the variable `c++-font-lock-keywords-2' but detects declarations in a more
d9e94c22
MS
2210accurate way that works in most cases for arbitrary types without the
2211need for `c++-font-lock-extra-types'.")
2212
2213(defvar c++-font-lock-keywords c++-font-lock-keywords-3
2214 "Default expressions to highlight in C++ mode.")
2215
2216(defun c++-font-lock-keywords-2 ()
2217 (c-compose-keywords-list c++-font-lock-keywords-2))
2218(defun c++-font-lock-keywords-3 ()
2219 (c-compose-keywords-list c++-font-lock-keywords-3))
2220(defun c++-font-lock-keywords ()
2221 (c-compose-keywords-list c++-font-lock-keywords))
2222
2223\f
2224;;; Objective-C.
2225
d9e94c22
MS
2226(defun c-font-lock-objc-method ()
2227 ;; Assuming the point is after the + or - that starts an Objective-C
2228 ;; method declaration, fontify it. This must be done before normal
2229 ;; casts, declarations and labels are fontified since they will get
2230 ;; false matches in these things.
0386b551
AM
2231 ;;
2232 ;; This function might do hidden buffer changes.
d9e94c22
MS
2233
2234 (c-fontify-types-and-refs
2235 ((first t)
2236 (c-promote-possible-types t))
2237
2238 (while (and
2239 (progn
2240 (c-forward-syntactic-ws)
2241
2242 ;; An optional method type.
2243 (if (eq (char-after) ?\()
2244 (progn
2245 (forward-char)
2246 (c-forward-syntactic-ws)
2247 (c-forward-type)
2248 (prog1 (c-go-up-list-forward)
2249 (c-forward-syntactic-ws)))
2250 t))
2251
2252 ;; The name. The first time it's the first part of
2253 ;; the function name, the rest of the time it's an
2254 ;; argument name.
2255 (looking-at c-symbol-key)
2256 (progn
2257 (goto-char (match-end 0))
2258 (c-put-font-lock-face (match-beginning 0)
2259 (point)
2260 (if first
2261 'font-lock-function-name-face
2262 'font-lock-variable-name-face))
2263 (c-forward-syntactic-ws)
2264
2265 ;; Another optional part of the function name.
2266 (when (looking-at c-symbol-key)
2267 (goto-char (match-end 0))
2268 (c-put-font-lock-face (match-beginning 0)
2269 (point)
2270 'font-lock-function-name-face)
2271 (c-forward-syntactic-ws))
2272
2273 ;; There's another argument if a colon follows.
2274 (eq (char-after) ?:)))
2275 (forward-char)
2276 (setq first nil))))
2277
2278(defun c-font-lock-objc-methods (limit)
2279 ;; Fontify method declarations in Objective-C. Nil is always
2280 ;; returned.
0386b551
AM
2281 ;;
2282 ;; This function might do hidden buffer changes.
d9e94c22
MS
2283
2284 (let (;; The font-lock package in Emacs is known to clobber
2285 ;; `parse-sexp-lookup-properties' (when it exists).
2286 (parse-sexp-lookup-properties
2287 (cc-eval-when-compile
2288 (boundp 'parse-sexp-lookup-properties))))
2289
2290 (c-find-decl-spots
2291 limit
2292 "[-+]"
2293 nil
2294 (lambda (match-pos inside-macro)
2295 (forward-char)
2296 (c-font-lock-objc-method))))
2297 nil)
2298
2299(c-override-default-keywords 'objc-font-lock-keywords)
2300
2301(defconst objc-font-lock-keywords-1 (c-lang-const c-matchers-1 objc)
2302 "Minimal font locking for Objective-C mode.
2303Fontifies only compiler directives (in addition to the syntactic
2304fontification of strings and comments).")
2305
2306(defconst objc-font-lock-keywords-2 (c-lang-const c-matchers-2 objc)
2307 "Fast normal font locking for Objective-C mode.
2308In addition to `objc-font-lock-keywords-1', this adds fontification of
2309keywords, simple types, declarations that are easy to recognize, the
2310user defined types on `objc-font-lock-extra-types', and the doc
2311comment styles specified by `c-doc-comment-style'.")
2312
2313(defconst objc-font-lock-keywords-3 (c-lang-const c-matchers-3 objc)
2314 "Accurate normal font locking for Objective-C mode.
9fc9a531 2315Like the variable `objc-font-lock-keywords-2' but detects declarations in a more
d9e94c22
MS
2316accurate way that works in most cases for arbitrary types without the
2317need for `objc-font-lock-extra-types'.")
2318
2319(defvar objc-font-lock-keywords objc-font-lock-keywords-3
2320 "Default expressions to highlight in Objective-C mode.")
2321
2322(defun objc-font-lock-keywords-2 ()
2323 (c-compose-keywords-list objc-font-lock-keywords-2))
2324(defun objc-font-lock-keywords-3 ()
2325 (c-compose-keywords-list objc-font-lock-keywords-3))
2326(defun objc-font-lock-keywords ()
2327 (c-compose-keywords-list objc-font-lock-keywords))
2328
2329;; Kludge to override the default value that
2330;; `objc-font-lock-extra-types' might have gotten from the font-lock
2331;; package. The value replaced here isn't relevant now anyway since
2332;; those types are builtin and therefore listed directly in
2333;; `c-primitive-type-kwds'.
2334(when (equal (sort (append objc-font-lock-extra-types nil) 'string-lessp)
2335 '("BOOL" "Class" "IMP" "SEL"))
2336 (setq objc-font-lock-extra-types
2337 (cc-eval-when-compile (list (concat "[" c-upper "]\\sw*")))))
2338
2339\f
2340;;; Java.
2341
2342(c-override-default-keywords 'java-font-lock-keywords)
2343
2344(defconst java-font-lock-keywords-1 (c-lang-const c-matchers-1 java)
2345 "Minimal font locking for Java mode.
2346Fontifies nothing except the syntactic fontification of strings and
2347comments.")
2348
2349(defconst java-font-lock-keywords-2 (c-lang-const c-matchers-2 java)
2350 "Fast normal font locking for Java mode.
2351In addition to `java-font-lock-keywords-1', this adds fontification of
2352keywords, simple types, declarations that are easy to recognize, the
2353user defined types on `java-font-lock-extra-types', and the doc
2354comment styles specified by `c-doc-comment-style'.")
2355
2356(defconst java-font-lock-keywords-3 (c-lang-const c-matchers-3 java)
2357 "Accurate normal font locking for Java mode.
9fc9a531 2358Like variable `java-font-lock-keywords-2' but detects declarations in a more
d9e94c22
MS
2359accurate way that works in most cases for arbitrary types without the
2360need for `java-font-lock-extra-types'.")
2361
2362(defvar java-font-lock-keywords java-font-lock-keywords-3
2363 "Default expressions to highlight in Java mode.")
2364
2365(defun java-font-lock-keywords-2 ()
2366 (c-compose-keywords-list java-font-lock-keywords-2))
2367(defun java-font-lock-keywords-3 ()
2368 (c-compose-keywords-list java-font-lock-keywords-3))
2369(defun java-font-lock-keywords ()
2370 (c-compose-keywords-list java-font-lock-keywords))
2371
2372\f
2373;;; CORBA IDL.
2374
2375(c-override-default-keywords 'idl-font-lock-keywords)
2376
2377(defconst idl-font-lock-keywords-1 (c-lang-const c-matchers-1 idl)
2378 "Minimal font locking for CORBA IDL mode.
2379Fontifies nothing except the syntactic fontification of strings and
2380comments.")
2381
2382(defconst idl-font-lock-keywords-2 (c-lang-const c-matchers-2 idl)
2383 "Fast normal font locking for CORBA IDL mode.
2384In addition to `idl-font-lock-keywords-1', this adds fontification of
2385keywords, simple types, declarations that are easy to recognize, the
2386user defined types on `idl-font-lock-extra-types', and the doc comment
2387styles specified by `c-doc-comment-style'.")
2388
2389(defconst idl-font-lock-keywords-3 (c-lang-const c-matchers-3 idl)
2390 "Accurate normal font locking for CORBA IDL mode.
9fc9a531 2391Like the variable `idl-font-lock-keywords-2' but detects declarations in a more
d9e94c22
MS
2392accurate way that works in most cases for arbitrary types without the
2393need for `idl-font-lock-extra-types'.")
2394
2395(defvar idl-font-lock-keywords idl-font-lock-keywords-3
2396 "Default expressions to highlight in CORBA IDL mode.")
2397
2398(defun idl-font-lock-keywords-2 ()
2399 (c-compose-keywords-list idl-font-lock-keywords-2))
2400(defun idl-font-lock-keywords-3 ()
2401 (c-compose-keywords-list idl-font-lock-keywords-3))
2402(defun idl-font-lock-keywords ()
2403 (c-compose-keywords-list idl-font-lock-keywords))
2404
2405\f
2406;;; Pike.
2407
2408(c-override-default-keywords 'pike-font-lock-keywords)
2409
2410(defconst pike-font-lock-keywords-1 (c-lang-const c-matchers-1 pike)
2411 "Minimal font locking for Pike mode.
2412Fontifies only preprocessor directives (in addition to the syntactic
2413fontification of strings and comments).")
2414
2415(defconst pike-font-lock-keywords-2 (c-lang-const c-matchers-2 pike)
2416 "Fast normal font locking for Pike mode.
2417In addition to `pike-font-lock-keywords-1', this adds fontification of
2418keywords, simple types, declarations that are easy to recognize, the
2419user defined types on `pike-font-lock-extra-types', and the doc
2420comment styles specified by `c-doc-comment-style'.")
2421
2422(defconst pike-font-lock-keywords-3 (c-lang-const c-matchers-3 pike)
2423 "Accurate normal font locking for Pike mode.
9fc9a531 2424Like the variable `pike-font-lock-keywords-2' but detects declarations in a more
d9e94c22
MS
2425accurate way that works in most cases for arbitrary types without the
2426need for `pike-font-lock-extra-types'.")
2427
2428(defvar pike-font-lock-keywords pike-font-lock-keywords-3
2429 "Default expressions to highlight in Pike mode.")
2430
2431(defun pike-font-lock-keywords-2 ()
2432 (c-compose-keywords-list pike-font-lock-keywords-2))
2433(defun pike-font-lock-keywords-3 ()
2434 (c-compose-keywords-list pike-font-lock-keywords-3))
2435(defun pike-font-lock-keywords ()
2436 (c-compose-keywords-list pike-font-lock-keywords))
2437
2438\f
2439;;; Doc comments.
2440
2441(defun c-font-lock-doc-comments (prefix limit keywords)
2442 ;; Fontify the comments between the point and LIMIT whose start
2443 ;; matches PREFIX with `c-doc-face-name'. Assumes comments have been
2444 ;; fontified with `font-lock-comment-face' already. nil is always
2445 ;; returned.
2446 ;;
2447 ;; After the fontification of a matching comment, fontification
2448 ;; according to KEYWORDS is applied inside it. It's a list like
2449 ;; `font-lock-keywords' except that anchored matches and eval
2450 ;; clauses aren't supported and that some abbreviated forms can't be
2451 ;; used. The buffer is narrowed to the comment while KEYWORDS is
2452 ;; applied; leading comment starters are included but trailing
2453 ;; comment enders for block comment are not.
2454 ;;
2455 ;; Note that faces added through KEYWORDS should never replace the
2456 ;; existing `c-doc-face-name' face since the existence of that face
2457 ;; is used as a flag in other code to skip comments.
0386b551
AM
2458 ;;
2459 ;; This function might do hidden buffer changes.
d9e94c22
MS
2460
2461 (let (comment-beg region-beg)
2462 (if (eq (get-text-property (point) 'face)
2463 'font-lock-comment-face)
2464 ;; Handle the case when the fontified region starts inside a
2465 ;; comment.
2466 (let ((range (c-literal-limits)))
2467 (setq region-beg (point))
2468 (when range
2469 (goto-char (car range)))
2470 (when (looking-at prefix)
2471 (setq comment-beg (point)))))
2472
2473 (while (or
2474 comment-beg
2475
2476 ;; Search for the prefix until a match is found at the start
2477 ;; of a comment.
2478 (while (when (re-search-forward prefix limit t)
2479 (setq comment-beg (match-beginning 0))
2480 (or (not (c-got-face-at comment-beg
2481 c-literal-faces))
2482 (and (/= comment-beg (point-min))
2483 (c-got-face-at (1- comment-beg)
2484 c-literal-faces))))
2485 (setq comment-beg nil))
2486 (setq region-beg comment-beg))
2487
691e26ae 2488 (if (elt (parse-partial-sexp comment-beg (+ comment-beg 2)) 7)
d9e94c22
MS
2489 ;; Collect a sequence of doc style line comments.
2490 (progn
2491 (goto-char comment-beg)
2492 (while (and (progn
2493 (c-forward-single-comment)
2494 (skip-syntax-forward " ")
2495 (< (point) limit))
2496 (looking-at prefix))))
2497 (goto-char comment-beg)
2498 (c-forward-single-comment))
2499 (if (> (point) limit) (goto-char limit))
2500 (setq comment-beg nil)
2501
2502 (let ((region-end (point))
2503 (keylist keywords) keyword matcher highlights)
2504 (c-put-font-lock-face region-beg region-end c-doc-face-name)
2505 (save-restriction
2506 ;; Narrow to the doc comment. Among other things, this
2507 ;; helps by making "^" match at the start of the comment.
2508 ;; Do not include a trailing block comment ender, though.
2509 (and (> region-end (1+ region-beg))
2510 (progn (goto-char region-end)
2511 (backward-char 2)
2512 (looking-at "\\*/"))
2513 (setq region-end (point)))
2514 (narrow-to-region region-beg region-end)
2515
2516 (while keylist
2517 (setq keyword (car keylist)
2518 keylist (cdr keylist)
2519 matcher (car keyword))
2520 (goto-char region-beg)
2521 (while (if (stringp matcher)
2522 (re-search-forward matcher region-end t)
2523 (funcall matcher region-end))
2524 (setq highlights (cdr keyword))
2525 (if (consp (car highlights))
2526 (while highlights
2527 (font-lock-apply-highlight (car highlights))
2528 (setq highlights (cdr highlights)))
2529 (font-lock-apply-highlight highlights))))
2530
2531 (goto-char region-end)))))
2532 nil)
2533(put 'c-font-lock-doc-comments 'lisp-indent-function 2)
2534
2535(defun c-find-invalid-doc-markup (regexp limit)
2536 ;; Used to fontify invalid markup in doc comments after the correct
5a89f0a7 2537 ;; ones have been fontified: Find the first occurrence of REGEXP
d9e94c22
MS
2538 ;; between the point and LIMIT that only is fontified with
2539 ;; `c-doc-face-name'. If a match is found then submatch 0 surrounds
2540 ;; the first char and t is returned, otherwise nil is returned.
0386b551
AM
2541 ;;
2542 ;; This function might do hidden buffer changes.
d9e94c22
MS
2543 (let (start)
2544 (while (if (re-search-forward regexp limit t)
2545 (not (eq (get-text-property
2546 (setq start (match-beginning 0)) 'face)
2547 c-doc-face-name))
2548 (setq start nil)))
2549 (when start
2550 (store-match-data (list (copy-marker start)
2551 (copy-marker (1+ start))))
2552 t)))
2553
0386b551
AM
2554;; GtkDoc patterns contributed by Masatake YAMATO <jet@gyve.org>.
2555
2556(defconst gtkdoc-font-lock-doc-comments
2557 (let ((symbol "[a-zA-Z0-9_]+")
2558 (header "^ \\* "))
7d0ee75c 2559 `((,(concat header "\\(" symbol "\\):[ \t]*$")
0386b551
AM
2560 1 ,c-doc-markup-face-name prepend nil)
2561 (,(concat symbol "()")
2562 0 ,c-doc-markup-face-name prepend nil)
2563 (,(concat header "\\(" "@" symbol "\\):")
2564 1 ,c-doc-markup-face-name prepend nil)
68a4a27a 2565 (,(concat "[#%@]" symbol)
0386b551
AM
2566 0 ,c-doc-markup-face-name prepend nil))
2567 ))
2568
2569(defconst gtkdoc-font-lock-doc-protection
2570 `(("< \\(public\\|private\\|protected\\) >"
2571 1 ,c-doc-markup-face-name prepend nil)))
2572
2573(defconst gtkdoc-font-lock-keywords
2574 `((,(lambda (limit)
2575 (c-font-lock-doc-comments "/\\*\\*$" limit
2576 gtkdoc-font-lock-doc-comments)
2577 (c-font-lock-doc-comments "/\\*< " limit
2578 gtkdoc-font-lock-doc-protection)
2579 ))))
2580
2581;; Javadoc.
2582
7bfc3fdb
MS
2583(defconst javadoc-font-lock-doc-comments
2584 `(("{@[a-z]+[^}\n\r]*}" ; "{@foo ...}" markup.
2585 0 ,c-doc-markup-face-name prepend nil)
0386b551
AM
2586 ("^\\(/\\*\\)?\\(\\s \\|\\*\\)*\\(@[a-z]+\\)" ; "@foo ..." markup.
2587 3 ,c-doc-markup-face-name prepend nil)
7bfc3fdb
MS
2588 (,(concat "</?\\sw" ; HTML tags.
2589 "\\("
2590 (concat "\\sw\\|\\s \\|[=\n\r*.:]\\|"
2591 "\"[^\"]*\"\\|'[^']*'")
2592 "\\)*>")
2593 0 ,c-doc-markup-face-name prepend nil)
2594 ("&\\(\\sw\\|[.:]\\)+;" ; HTML entities.
2595 0 ,c-doc-markup-face-name prepend nil)
2596 ;; Fontify remaining markup characters as invalid. Note
2597 ;; that the Javadoc spec is hazy about when "@" is
2598 ;; allowed in non-markup use.
2599 (,(lambda (limit)
2600 (c-find-invalid-doc-markup "[<>&]\\|{@" limit))
0386b551 2601 0 'font-lock-warning-face prepend nil)))
7bfc3fdb
MS
2602
2603(defconst javadoc-font-lock-keywords
2604 `((,(lambda (limit)
2605 (c-font-lock-doc-comments "/\\*\\*" limit
2606 javadoc-font-lock-doc-comments)))))
d9e94c22 2607
0386b551
AM
2608;; Pike autodoc.
2609
d9e94c22
MS
2610(defconst autodoc-decl-keywords
2611 ;; Adorned regexp matching the keywords that introduce declarations
2612 ;; in Pike Autodoc.
2613 (cc-eval-when-compile
2614 (c-make-keywords-re t '("@decl" "@elem" "@index" "@member") 'pike-mode)))
2615
2616(defconst autodoc-decl-type-keywords
2617 ;; Adorned regexp matching the keywords that are followed by a type.
2618 (cc-eval-when-compile
2619 (c-make-keywords-re t '("@elem" "@member") 'pike-mode)))
2620
2621(defun autodoc-font-lock-line-markup (limit)
2622 ;; Fontify all line oriented keywords between the point and LIMIT.
2623 ;; Nil is always returned.
0386b551
AM
2624 ;;
2625 ;; This function might do hidden buffer changes.
d9e94c22
MS
2626
2627 (let ((line-re (concat "^\\(\\(/\\*!\\|\\s *\\("
2628 c-current-comment-prefix
2629 "\\)\\)\\s *\\)@[A-Za-z_-]+\\(\\s \\|$\\)"))
2630 (markup-faces (list c-doc-markup-face-name c-doc-face-name)))
2631
2632 (while (re-search-forward line-re limit t)
2633 (goto-char (match-end 1))
2634
2635 (if (looking-at autodoc-decl-keywords)
2636 (let* ((kwd-pos (point))
2637 (start (match-end 1))
2638 (pos start)
2639 end)
2640
2641 (c-put-font-lock-face (point) pos markup-faces)
2642
2643 ;; Put a declaration end mark at the markup keyword and
2644 ;; remove the faces from the rest of the line so that it
2645 ;; gets refontified as a declaration later on by
2646 ;; `c-font-lock-declarations'.
2647 (c-put-char-property (1- pos) 'c-type 'c-decl-end)
2648 (goto-char pos)
2649 (while (progn
2650 (end-of-line)
2651 (setq end (point))
2652 (and (eq (char-before) ?@)
2653 (not (eobp))
2654 (progn (forward-char)
0386b551 2655 (skip-syntax-forward " ")
d9e94c22
MS
2656 (looking-at c-current-comment-prefix))))
2657 (goto-char (match-end 0))
2658 (c-remove-font-lock-face pos (1- end))
2659 (c-put-font-lock-face (1- end) end markup-faces)
2660 (setq pos (point)))
2661
2662 ;; Include the final newline in the removed area. This
2663 ;; has no visual effect but it avoids some tricky special
2664 ;; cases in the testsuite wrt the differences in string
2665 ;; fontification in Emacs vs XEmacs.
2666 (c-remove-font-lock-face pos (min (1+ (point)) (point-max)))
2667
2668 ;; Must handle string literals explicitly inside the declaration.
2669 (goto-char start)
2670 (while (re-search-forward
2671 "\"\\([^\\\"]\\|\\\\.\\)*\"\\|'\\([^\\']\\|\\\\.\\)*'"
2672 end 'move)
2673 (c-put-font-lock-string-face (match-beginning 0)
2674 (point)))
2675
2676 ;; Fontify types after keywords that always are followed
2677 ;; by them.
2678 (goto-char kwd-pos)
2679 (when (looking-at autodoc-decl-type-keywords)
2680 (c-fontify-types-and-refs ((c-promote-possible-types t))
2681 (goto-char start)
2682 (c-forward-syntactic-ws)
2683 (c-forward-type))))
2684
2685 ;; Mark each whole line as markup, as long as the logical line
2686 ;; continues.
2687 (while (progn
2688 (c-put-font-lock-face (point)
2689 (progn (end-of-line) (point))
2690 markup-faces)
2691 (and (eq (char-before) ?@)
2692 (not (eobp))
2693 (progn (forward-char)
0386b551 2694 (skip-syntax-forward " ")
d9e94c22
MS
2695 (looking-at c-current-comment-prefix))))
2696 (goto-char (match-end 0))))))
2697
2698 nil)
2699
7bfc3fdb
MS
2700(defconst autodoc-font-lock-doc-comments
2701 `(("@\\(\\w+{\\|\\[\\([^\]@\n\r]\\|@@\\)*\\]\\|[@}]\\|$\\)"
2702 ;; In-text markup.
2703 0 ,c-doc-markup-face-name prepend nil)
2704 (autodoc-font-lock-line-markup)
2705 ;; Fontify remaining markup characters as invalid.
2706 (,(lambda (limit)
2707 (c-find-invalid-doc-markup "@" limit))
0386b551 2708 0 'font-lock-warning-face prepend nil)
7bfc3fdb
MS
2709 ))
2710
d9e94c22
MS
2711(defun autodoc-font-lock-keywords ()
2712 ;; Note that we depend on that `c-current-comment-prefix' has got
2713 ;; its proper value here.
0386b551
AM
2714 ;;
2715 ;; This function might do hidden buffer changes.
d9e94c22
MS
2716
2717 ;; The `c-type' text property with `c-decl-end' is used to mark the
2718 ;; end of the `autodoc-decl-keywords' occurrences to fontify the
2719 ;; following declarations.
2720 (setq c-type-decl-end-used t)
2721
7bfc3fdb
MS
2722 `((,(lambda (limit)
2723 (c-font-lock-doc-comments "/[*/]!" limit
2724 autodoc-font-lock-doc-comments)))))
d9e94c22
MS
2725
2726\f
3c0ab532 2727;; 2006-07-10: awk-font-lock-keywords has been moved back to cc-awk.el.
d9e94c22
MS
2728(cc-provide 'cc-fonts)
2729
2730;;; cc-fonts.el ends here