]> git.eshelyaron.com Git - emacs.git/commitdiff
Fontify C++ for loop variable as variable, even when followed by parentheses
authorAlan Mackenzie <acm@muc.de>
Fri, 12 May 2017 21:11:49 +0000 (21:11 +0000)
committerAlan Mackenzie <acm@muc.de>
Fri, 12 May 2017 21:11:49 +0000 (21:11 +0000)
In the following: "for (auto *Friend : Class->friends()) {", "Friend" was
getting fontified as a function, due to insufficient checking of the tokens
between it and "()".

* lisp/progmodes/cc-langs.el (c-:-op-cont-tokens, c-:-op-cont-regexp): New
lang-consts/vars.

* lisp/progmodes/cc-engine.el (c-forward-declarator): After finding a putative
declarator's identifier, check for a ":" token inside a for's parentheses, and
abort the search for "(" if this is found.

lisp/progmodes/cc-engine.el
lisp/progmodes/cc-langs.el

index 6d7bab7a65c47ab7dcd117f4a078f57958942c82..9773b1ca85b22972ab7871c6c77e7cb52ee28913 100644 (file)
@@ -8092,8 +8092,29 @@ comment at the start of cc-engine.el for more info."
         ;; initializing brace lists.
         (let (found)
           (while
-              (and (setq found (c-syntactic-re-search-forward
-                                "[;,]\\|\\s)\\|\\'\\|\\(=\\|\\s(\\)" limit t t))
+              (and (progn
+                     ;; In the next loop, we keep searching forward whilst
+                     ;; we find ":"s which aren't single colons inside C++
+                     ;; "for" statements.
+                     (while
+                         (and
+                          (setq found
+                                (c-syntactic-re-search-forward
+                                 "[;:,]\\|\\s)\\|\\'\\|\\(=\\|\\s(\\)"
+                                 limit t t))
+                          (eq (char-before) ?:)
+                          (if (looking-at c-:-op-cont-regexp)
+                              (progn (goto-char (match-end 0)) t)
+                            (not
+                             (and (c-major-mode-is 'c++-mode)
+                                  (save-excursion
+                                    (and
+                                     (c-go-up-list-backward)
+                                     (eq (char-after) ?\()
+                                     (progn (c-backward-syntactic-ws)
+                                            (c-simple-skip-symbol-backward))
+                                     (looking-at c-paren-stmt-key))))))))
+                     found)
                    (eq (char-before) ?\[)
                    (c-go-up-list-forward))
             (setq brackets-after-id t))
index 3b455fc0908459809fa4c175102a0b5c9ca4937a..84d4eab75afbec64407197bba9dd10b1ab2a30b9 100644 (file)
@@ -1334,6 +1334,21 @@ operators."
 (c-lang-defvar c-multichar->-op-not->>-regexp
   (c-lang-const c-multichar->-op-not->>-regexp))
 
+(c-lang-defconst c-:-op-cont-tokens
+  ;; A list of second and subsequent characters of all multicharacter tokens
+  ;; that begin with ":".
+  t (c-filter-ops (c-lang-const c-all-op-syntax-tokens)
+                 t
+                 "\\`:."
+                 (lambda (op) (substring op 1))))
+
+(c-lang-defconst c-:-op-cont-regexp
+  ;; Regexp matching the second and subsequent characters of all
+  ;; multicharacter tokens that begin with ":".
+  t (c-make-keywords-re nil (c-lang-const c-:-op-cont-tokens)))
+(c-lang-defvar c-:-op-cont-regexp
+  (c-lang-const c-:-op-cont-regexp))
+
 (c-lang-defconst c-stmt-delim-chars
   ;; The characters that should be considered to bound statements.  To
   ;; optimize `c-crosses-statement-barrier-p' somewhat, it's assumed to