emacs-diffs
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]