From: Daniel Colascione <dan.colascione@gmail.com>
To: 7918@debbugs.gnu.org
Subject: bug#7918: [PATCH] cc-mode: only the first clause of a for-loop should be checked for declarations
Date: Tue, 25 Jan 2011 22:36:22 -0800 [thread overview]
Message-ID: <AANLkTimQFYjda-0_fC1XEjkwVPVixa5mirYAmeOnqooK@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 127 bytes --]
// This code has no variable declarations
void foo() {
for (; (DWORD) a * b ;)
;
for (; a * b ;)
;
}
[-- Attachment #2: fix-for.patch --]
[-- Type: text/plain, Size: 3799 bytes --]
=== modified file 'lisp/progmodes/cc-fonts.el'
--- lisp/progmodes/cc-fonts.el 2010-12-07 12:15:28 +0000
+++ lisp/progmodes/cc-fonts.el 2011-01-25 11:10:00 +0000
@@ -1080,7 +1080,8 @@
;; o - '<> if the arglist is of angle bracket type;
;; o - 'arglist if it's some other arglist;
;; o - nil, if not in an arglist at all. This includes the
- ;; parenthesised condition which follows "if", "while", etc.
+ ;; parenthesised condition which follows "if", "while", etc.,
+ ;; but not "for", which is 'arglist after `;'.
context
;; The position of the next token after the closing paren of
;; the last detected cast.
@@ -1109,7 +1110,7 @@
;; `c-forward-decl-or-cast-1' and `c-forward-label' for
;; later fontification.
(c-record-type-identifiers t)
- label-type
+ label-type paren-state most-enclosing-brace
c-record-ref-identifiers
;; Make `c-forward-type' calls mark up template arglists if
;; it finds any. That's necessary so that we later will
@@ -1171,7 +1172,6 @@
'font-lock-function-name-face))))
(c-font-lock-function-postfix limit))
-
(setq start-pos (point))
(when
;; The result of the `if' condition below is true when we don't recognize a
@@ -1189,7 +1189,31 @@
;; (e.g. "for (").
(let ((type (and (> match-pos (point-min))
(c-get-char-property (1- match-pos) 'c-type))))
- (cond ((not (memq (char-before match-pos) '(?\( ?, ?\[ ?<)))
+ (cond
+ (;; Try to not fontify the second and third clauses of
+ ;; `for' statements as declarations.
+ (and (or (eq (char-before match-pos) ?\;)
+ (save-excursion
+ ;; Catch things like for(; (DWORD)(int) x &
+ ;; y; ) without invoking the full might of
+ ;; c-beginning-of-statement-1.
+ (goto-char match-pos)
+ (while (eq (char-before) ?\))
+ (c-go-list-backward)
+ (c-backward-syntactic-ws))
+ (eq (char-before) ?\;)))
+
+ (setq paren-state (c-parse-state))
+ (setq most-enclosing-brace
+ (c-most-enclosing-brace paren-state))
+ (eq (char-after most-enclosing-brace) ?\())
+
+ ;; After a ";" in a for-block. A declaration can never
+ ;; begin after a `;' if the most enclosing paren is a
+ ;; `('.
+ (setq context 'arglist
+ c-restricted-<>-arglists t))
+ ((not (memq (char-before match-pos) '(?\( ?, ?\[ ?<)))
(setq context nil
c-restricted-<>-arglists nil))
;; A control flow expression
@@ -1252,7 +1276,7 @@
;; Are we at a declarator? Try to go back to the declaration
;; to check this. Note that `c-beginning-of-decl-1' is slow,
;; so we cache its result between calls.
- (let (paren-state bod-res encl-pos is-typedef)
+ (let (bod-res encl-pos is-typedef)
(goto-char start-pos)
(save-excursion
(unless (and decl-search-lim
@@ -1318,20 +1342,7 @@
;; Back up to the type to fontify the declarator(s).
(goto-char (car decl-or-cast))
- (let ((decl-list
- (if context
- ;; Should normally not fontify a list of
- ;; declarators inside an arglist, but the first
- ;; argument in the ';' separated list of a "for"
- ;; statement is an exception.
- (when (eq (char-before match-pos) ?\()
- (save-excursion
- (goto-char (1- match-pos))
- (c-backward-syntactic-ws)
- (and (c-simple-skip-symbol-backward)
- (looking-at c-paren-stmt-key))))
- t)))
-
+ (let ((decl-list (not context)))
;; Fix the `c-decl-id-start' or `c-decl-type-start' property
;; before the first declarator if it's a list.
;; `c-font-lock-declarators' handles the rest.
next reply other threads:[~2011-01-26 6:36 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-26 6:36 Daniel Colascione [this message]
2016-02-26 6:18 ` bug#7918: [PATCH] cc-mode: only the first clause of a for-loop should be checked for declarations Lars Ingebrigtsen
2016-02-26 6:31 ` Daniel Colascione
2016-02-26 6:33 ` Daniel Colascione
2016-03-01 18:02 ` Alan Mackenzie
2016-03-01 18:05 ` Daniel Colascione
2016-04-01 16:18 ` Alan Mackenzie
2016-04-25 18:04 ` Alan Mackenzie
[not found] ` <handler.7918.D7918.146160769022226.notifdone@debbugs.gnu.org>
2017-06-29 1:06 ` npostavs
2017-07-03 19:09 ` Glenn Morris
2017-07-03 19:46 ` npostavs
2017-07-03 20:18 ` Alan Mackenzie
2017-07-05 15:55 ` Glenn Morris
2017-07-05 20:14 ` Alan Mackenzie
2017-07-06 1:39 ` Glenn Morris
2017-07-07 14:47 ` Alan Mackenzie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AANLkTimQFYjda-0_fC1XEjkwVPVixa5mirYAmeOnqooK@mail.gmail.com \
--to=dan.colascione@gmail.com \
--cc=7918@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).