[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Font-lock does not fontify const pointer declaration
From: |
Alan Mackenzie |
Subject: |
Re: Font-lock does not fontify const pointer declaration |
Date: |
Thu, 17 Apr 2008 08:49:18 +0000 |
User-agent: |
Mutt/1.5.9i |
Good Morning, Simon!
On Thu, Sep 14, 2006 at 03:32:38PM +0100, Marshall, Simon wrote:
> Emacs 19-21 fontifies the following C/C++ snippet:
> int *p; // ok
> const int *p; // ok
> int *const p; // not ok in CVS emacs
> const int *const p; // not ok in CVS emacs
> so that "p" is in font-lock-variable-name-face.
> In Emacs CVS, it does not fontify "p" when p is declared as a const pointer.
This was a bug in one of the regexps parsing declarators, namely
c-type-decl-prefix-key. It was recognising "const" as an identifier,
because the explicit check for "const\|throw\|volatile" came later in the
regexp than "[[:alpha:]_]....".
Please apply the following patch, which fixes it, and let me know if it
works or not. PLEASE NOTE: because a macro in cc-langs has changed, you
need to recompile cc-{mode,engine}.el. Here's a recipe for this, after
patching the files:
M-x byte-compile-file cc-langs.el
M-x load-file cc-langs.elc
M-x byte-compile-file cc-mode.el
M-x load-file cc-mode.elc
M-x byte-compile-file cc-engine.el
M-x load-file cc-engine.el
M-x c++-mode
Index: cc-langs.el
===================================================================
RCS file: /cvsroot/cc-mode/cc-mode/cc-langs.el,v
retrieving revision 5.267.2.16
diff -c -r5.267.2.16 cc-langs.el
*** cc-langs.el 15 Apr 2008 20:05:59 -0000 5.267.2.16
--- cc-langs.el 17 Apr 2008 08:12:30 -0000
***************
*** 2596,2610 ****
c++ (concat "\\("
"[*\(&]"
"\\|"
! (concat "\\(" ; 2
;; If this matches there's special treatment in
;; `c-font-lock-declarators' and
;; `c-font-lock-declarations' that check for a
;; complete name followed by ":: *".
(c-lang-const c-identifier-start)
"\\)")
- "\\|"
- (c-lang-const c-type-decl-prefix-key)
"\\)"
"\\([^=]\\|$\\)")
pike "\\(\\*\\)\\([^=]\\|$\\)")
--- 2596,2610 ----
c++ (concat "\\("
"[*\(&]"
"\\|"
! (c-lang-const c-type-decl-prefix-key)
! "\\|"
! (concat "\\(" ; 3
;; If this matches there's special treatment in
;; `c-font-lock-declarators' and
;; `c-font-lock-declarations' that check for a
;; complete name followed by ":: *".
(c-lang-const c-identifier-start)
"\\)")
"\\)"
"\\([^=]\\|$\\)")
pike "\\(\\*\\)\\([^=]\\|$\\)")
Index: cc-engine.el
===================================================================
RCS file: /cvsroot/cc-mode/cc-mode/cc-engine.el,v
retrieving revision 5.539.2.17
diff -c -r5.539.2.17 cc-engine.el
*** cc-engine.el 15 Apr 2008 20:05:59 -0000 5.539.2.17
--- cc-engine.el 17 Apr 2008 08:12:35 -0000
***************
*** 5399,5406 ****
;; `c-font-lock-declarators'.)
(while (and (looking-at c-type-decl-prefix-key)
(if (and (c-major-mode-is 'c++-mode)
! (match-beginning 2))
! ;; If the second submatch matches in C++ then
;; we're looking at an identifier that's a
;; prefix only if it specifies a member pointer.
(when (setq got-identifier (c-forward-name))
--- 5400,5407 ----
;; `c-font-lock-declarators'.)
(while (and (looking-at c-type-decl-prefix-key)
(if (and (c-major-mode-is 'c++-mode)
! (match-beginning 3))
! ;; If the third submatch matches in C++ then
;; we're looking at an identifier that's a
;; prefix only if it specifies a member pointer.
(when (setq got-identifier (c-forward-name))
Index: cc-fonts.el
===================================================================
RCS file: /cvsroot/cc-mode/cc-mode/cc-fonts.el,v
retrieving revision 5.205.2.6
diff -c -r5.205.2.6 cc-fonts.el
*** cc-fonts.el 15 Apr 2008 18:31:12 -0000 5.205.2.6
--- cc-fonts.el 17 Apr 2008 08:12:36 -0000
***************
*** 866,873 ****
;; `c-forward-decl-or-cast-1'.)
(while (and (looking-at c-type-decl-prefix-key)
(if (and (c-major-mode-is 'c++-mode)
! (match-beginning 2))
! ;; If the second submatch matches in C++ then
;; we're looking at an identifier that's a
;; prefix only if it specifies a member pointer.
(progn
--- 866,873 ----
;; `c-forward-decl-or-cast-1'.)
(while (and (looking-at c-type-decl-prefix-key)
(if (and (c-major-mode-is 'c++-mode)
! (match-beginning 3))
! ;; If the third submatch matches in C++ then
;; we're looking at an identifier that's a
;; prefix only if it specifies a member pointer.
(progn
> Simon.
--
Alan Mackenzie (Nuremberg, Germany).
- Re: Font-lock does not fontify const pointer declaration,
Alan Mackenzie <=