[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs-25 9dfece1: Correctly fontify C++ initializations wh
From: |
Alan Mackenzie |
Subject: |
[Emacs-diffs] emacs-25 9dfece1: Correctly fontify C++ initializations which "look like" functions. |
Date: |
Thu, 04 Feb 2016 19:01:53 +0000 |
branch: emacs-25
commit 9dfece1413846e4df438cd20956c58e12c84dea3
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>
Correctly fontify C++ initializations which "look like" functions.
Fixes bug#7579.
lisp/progmodes/cc-engine.el (c-forward-declarator): Add extra optional
parameter to enable handling of "anonymous" declarators in declarations.
lisp/progmodes/cc-fonts.el (c-font-lock-declarators): Check more rigorously
whether a "(" opens a parameter list of a function, or an initialization of
a
variable.
---
lisp/progmodes/cc-engine.el | 23 ++++++++++++++++-------
lisp/progmodes/cc-fonts.el | 25 +++++++++++++++++++++++--
2 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index b75d667..d30447f 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -6808,7 +6808,7 @@ comment at the start of cc-engine.el for more info."
;; This identifier is bound only in the inner let.
'(setq start id-start))))
-(defun c-forward-declarator (&optional limit)
+(defun c-forward-declarator (&optional limit accept-anon)
;; Assuming point is at the start of a declarator, move forward over it,
;; leaving point at the next token after it (e.g. a ) or a ; or a ,).
;;
@@ -6817,6 +6817,11 @@ comment at the start of cc-engine.el for more info."
;; BRACKETS-AFTER-ID is non-nil if a [...] pair is present after the id.
;; GOT-INIT is non-nil when the declarator is followed by "=" or "(".
;;
+ ;; If ACCEPT-ANON is non-nil, move forward over any "anonymous declarator",
+ ;; i.e. something like the (*) in int (*), such as might be found in a
+ ;; declaration. In such a case ID-START and ID-END in the return value are
+ ;; both set to nil. A "null" "anonymous declarator" gives a non-nil result.
+ ;;
;; If no declarator is found, leave point unmoved and return nil. LIMIT is
;; an optional limit for forward searching.
;;
@@ -6871,13 +6876,17 @@ comment at the start of cc-engine.el for more info."
;; If we haven't passed the identifier already, do it now.
(unless got-identifier
- (setq id-start (point))
- (c-forward-name))
- (prog1
- (/= (point) here)
+ (setq id-start (point)))
+ (cond
+ ((or got-identifier
+ (c-forward-name))
(save-excursion
(c-backward-syntactic-ws)
- (setq id-end (point)))))
+ (setq id-end (point))))
+ (accept-anon
+ (setq id-start nil id-end nil)
+ t)
+ (t (/= (point) here))))
;; Skip out of the parens surrounding the identifier. If closing
;; parens are missing, this form returns nil.
@@ -7266,7 +7275,7 @@ comment at the start of cc-engine.el for more info."
(goto-char id-start)
;; Skip over type decl prefix operators. (Note similar code in
- ;; `c-font-lock-declarators'.)
+ ;; `c-forward-declarator'.)
(if (and c-recognize-typeless-decls
(equal c-type-decl-prefix-key "\\<\\>"))
(when (eq (char-after) ?\()
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 1e101d1..3cc537b 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -1008,7 +1008,7 @@ casts and declarations are fontified. Used on level 2
and higher."
((pos (point)) next-pos id-start id-end
decl-res
paren-depth
- id-face got-init
+ id-face got-type got-init
c-last-identifier-range
(separator-prop (if types 'c-decl-type-start 'c-decl-id-start))
brackets-after-id)
@@ -1020,7 +1020,28 @@ casts and declarations are fontified. Used on level 2
and higher."
(setq next-pos (point)
id-start (car decl-res)
id-face (if (and (eq (char-after) ?\()
- (not (car (cddr decl-res)))) ; brackets-after-id
+ (not (car (cddr decl-res))) ; brackets-after-id
+ (or (not (c-major-mode-is 'c++-mode))
+ (save-excursion
+ (let (c-last-identifier-range)
+ (forward-char)
+ (c-forward-syntactic-ws)
+ (catch 'is-function
+ (while
+ (progn
+ (if (eq (char-after) ?\))
+ (throw 'is-function t))
+ (setq got-type (c-forward-type))
+ (cond
+ ((null got-type)
+ (throw 'is-function nil))
+ ((not (eq got-type 'maybe))
+ (throw 'is-function t)))
+ (c-forward-declarator limit t)
+ (eq (char-after) ?,))
+ (forward-char)
+ (c-forward-syntactic-ws))
+ t)))))
'font-lock-function-name-face
'font-lock-variable-name-face)
got-init (and (cadr (cddr decl-res)) ; got-init
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] emacs-25 9dfece1: Correctly fontify C++ initializations which "look like" functions.,
Alan Mackenzie <=