diff options
| author | Alan Mackenzie | 2019-11-09 12:09:30 +0000 |
|---|---|---|
| committer | Alan Mackenzie | 2019-11-09 12:09:30 +0000 |
| commit | b293aa91bcc7f553ffbc6c67027f3c86d06ffbd7 (patch) | |
| tree | 39f019da4ce7a41d1367c01f590487b529bad2a3 /lisp/progmodes | |
| parent | 6daa80d04e575a27f53f60f5fafd7fcba39b4b2a (diff) | |
| download | emacs-b293aa91bcc7f553ffbc6c67027f3c86d06ffbd7.tar.gz emacs-b293aa91bcc7f553ffbc6c67027f3c86d06ffbd7.zip | |
CC Mode. Allow fontification of "wrong" style comments with warning face.
This fixes bug #4192.
* etc/NEWS: Add a new entry.
* lisp/progmodes/cc-defs.el (c-font-lock-flush): New macro.
* lisp/progmodes/cc-cmds.el (c-toggle-comment-style): On toggling the comment
style, invoke c-font-lock-flush when c-mark-wrong-style-of-comment is non-nil,
to cause that marking to be done instead on the other style of comment.
* lisp/progmodes/cc-fonts.el (c-maybe-font-lock-wrong-style-comments): New
function.
(c-cpp-matchers): Call c-maybe-font-lock-wrong-style-comments when
appropriate.
* lisp/progmodes/cc-vars.el (c-mark-wrong-style-of-comment): New customizable
option.
* doc/misc/cc-mode.texi (top level, Indentation Commands, Guessing the Style,
Custom Macros): For some opening quote marks, correct '' to ``.
(Minor Modes): Add an xref to the new page "Wrong Comment Style" in a
footnote.
(Wrong Comment Style): New page.
Diffstat (limited to 'lisp/progmodes')
| -rw-r--r-- | lisp/progmodes/cc-cmds.el | 10 | ||||
| -rw-r--r-- | lisp/progmodes/cc-defs.el | 7 | ||||
| -rw-r--r-- | lisp/progmodes/cc-fonts.el | 61 | ||||
| -rw-r--r-- | lisp/progmodes/cc-vars.el | 8 |
4 files changed, 85 insertions, 1 deletions
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el index 9aa2019ae60..af2efb63fc3 100644 --- a/lisp/progmodes/cc-cmds.el +++ b/lisp/progmodes/cc-cmds.el | |||
| @@ -391,6 +391,16 @@ This action does nothing when the mode only has one comment style." | |||
| 391 | (if c-block-comment-flag | 391 | (if c-block-comment-flag |
| 392 | (concat " " c-block-comment-ender) | 392 | (concat " " c-block-comment-ender) |
| 393 | "")) | 393 | "")) |
| 394 | ;; If necessary, invert the sense of fontification of wrong style comments. | ||
| 395 | (when (and c-mark-wrong-style-of-comment | ||
| 396 | font-lock-mode | ||
| 397 | c-block-comment-starter | ||
| 398 | c-block-comment-ender) | ||
| 399 | (save-excursion | ||
| 400 | (save-restriction | ||
| 401 | (widen) | ||
| 402 | (goto-char (point-min)) | ||
| 403 | (c-font-lock-flush (point-min) (point-max))))) | ||
| 394 | (c-update-modeline) | 404 | (c-update-modeline) |
| 395 | (c-keep-region-active)) | 405 | (c-keep-region-active)) |
| 396 | 406 | ||
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index e9a3e16db36..6a9371e6f19 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el | |||
| @@ -219,6 +219,13 @@ This variant works around bugs in `eval-when-compile' in various | |||
| 219 | `(cl-delete-duplicates ,cl-seq ,@cl-keys) | 219 | `(cl-delete-duplicates ,cl-seq ,@cl-keys) |
| 220 | `(delete-duplicates ,cl-seq ,@cl-keys)))) | 220 | `(delete-duplicates ,cl-seq ,@cl-keys)))) |
| 221 | 221 | ||
| 222 | (defmacro c-font-lock-flush (beg end) | ||
| 223 | "Declare the region BEG...END's fontification as out-of-date. | ||
| 224 | On XEmacs and older Emacsen, this refontifies that region immediately." | ||
| 225 | (if (fboundp 'font-lock-flush) | ||
| 226 | `(font-lock-flush ,beg ,end) | ||
| 227 | `(font-lock-fontify-region ,beg ,end))) | ||
| 228 | |||
| 222 | (defmacro c-point (position &optional point) | 229 | (defmacro c-point (position &optional point) |
| 223 | "Return the value of certain commonly referenced POSITIONs relative to POINT. | 230 | "Return the value of certain commonly referenced POSITIONs relative to POINT. |
| 224 | The current point is used if POINT isn't specified. POSITION can be | 231 | The current point is used if POINT isn't specified. POSITION can be |
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index c27b70603ed..0daea8c84c9 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el | |||
| @@ -95,6 +95,7 @@ | |||
| 95 | ;; during compilation. | 95 | ;; during compilation. |
| 96 | (cc-bytecomp-defvar c-preprocessor-face-name) | 96 | (cc-bytecomp-defvar c-preprocessor-face-name) |
| 97 | (cc-bytecomp-defvar c-reference-face-name) | 97 | (cc-bytecomp-defvar c-reference-face-name) |
| 98 | (cc-bytecomp-defvar c-block-comment-flag) | ||
| 98 | (cc-bytecomp-defun c-fontify-recorded-types-and-refs) | 99 | (cc-bytecomp-defun c-fontify-recorded-types-and-refs) |
| 99 | (cc-bytecomp-defun c-font-lock-declarators) | 100 | (cc-bytecomp-defun c-font-lock-declarators) |
| 100 | (cc-bytecomp-defun c-font-lock-objc-method) | 101 | (cc-bytecomp-defun c-font-lock-objc-method) |
| @@ -532,7 +533,12 @@ stuff. Used on level 1 and higher." | |||
| 532 | (sws-depth (c-lang-const c-syntactic-ws-depth)) | 533 | (sws-depth (c-lang-const c-syntactic-ws-depth)) |
| 533 | (nsws-depth (c-lang-const c-nonempty-syntactic-ws-depth))) | 534 | (nsws-depth (c-lang-const c-nonempty-syntactic-ws-depth))) |
| 534 | 535 | ||
| 535 | `(;; The stuff after #error and #warning is a message, so | 536 | `(;; Fontify "invalid" comment delimiters |
| 537 | ,@(when (and (c-lang-const c-block-comment-starter) | ||
| 538 | (c-lang-const c-line-comment-starter)) | ||
| 539 | `(c-maybe-font-lock-wrong-style-comments)) | ||
| 540 | |||
| 541 | ;; The stuff after #error and #warning is a message, so | ||
| 536 | ;; fontify it as a string. | 542 | ;; fontify it as a string. |
| 537 | ,@(when (c-lang-const c-cpp-message-directives) | 543 | ,@(when (c-lang-const c-cpp-message-directives) |
| 538 | (let* ((re (c-make-keywords-re 'appendable ; nil | 544 | (let* ((re (c-make-keywords-re 'appendable ; nil |
| @@ -715,6 +721,59 @@ stuff. Used on level 1 and higher." | |||
| 715 | (parse-partial-sexp end limit nil nil state 'syntax-table))) | 721 | (parse-partial-sexp end limit nil nil state 'syntax-table))) |
| 716 | nil) | 722 | nil) |
| 717 | 723 | ||
| 724 | (defun c-maybe-font-lock-wrong-style-comments (limit) | ||
| 725 | ;; This function will be called from font-lock-for a region bounded by POINT | ||
| 726 | ;; and LIMIT, as though it were to identify a keyword for | ||
| 727 | ;; font-lock-keyword-face. It always returns NIL to inhibit this and | ||
| 728 | ;; prevent a repeat invocation. See elisp/lispref page "Search-based | ||
| 729 | ;; Fontification". | ||
| 730 | ;; | ||
| 731 | ;; This function fontifies "invalid" comment delimiters with | ||
| 732 | ;; `font-lock-warning-face'. A delimiter is "invalid" when | ||
| 733 | ;; `c-mark-wrong-style-of-comment' is non-nil, and the delimiter style is | ||
| 734 | ;; not the default specified by `c-block-comment-flag'. | ||
| 735 | (when c-mark-wrong-style-of-comment | ||
| 736 | (let* ((lit (c-semi-pp-to-literal (point))) | ||
| 737 | (s (car lit)) ; parse-partial-sexp state. | ||
| 738 | ) | ||
| 739 | ;; First, deal with and move out of any literal we start in. | ||
| 740 | (cond | ||
| 741 | ((null (cadr lit))) ; Not in a literal | ||
| 742 | ((eq (cadr lit) 'string) | ||
| 743 | (setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table))) | ||
| 744 | ((and (not c-block-comment-flag) ; In an "invalid" block comment | ||
| 745 | (eq (cadr lit) 'c)) | ||
| 746 | (setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table)) | ||
| 747 | ;; Font lock the block comment ender with warning face. | ||
| 748 | (when (not (nth 4 s)) | ||
| 749 | (c-put-font-lock-face (- (point) (length c-block-comment-ender)) | ||
| 750 | (point) font-lock-warning-face))) | ||
| 751 | (t ; In a line comment, or a "valid" block comment | ||
| 752 | (setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table)))) | ||
| 753 | |||
| 754 | (while (< (point) limit) | ||
| 755 | (setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table)) | ||
| 756 | (cond | ||
| 757 | ((or (nth 3 s) ; In a string | ||
| 758 | (and (nth 4 s) ; In a comment | ||
| 759 | (eq (nth 7 s) ; Comment style | ||
| 760 | (if c-block-comment-flag | ||
| 761 | nil ; Block comment | ||
| 762 | 1)))) ; Line comment | ||
| 763 | ;; Move over a "valid" literal. | ||
| 764 | (setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table))) | ||
| 765 | ((nth 4 s) ; In an invalid comment | ||
| 766 | ;; Fontify the invalid comment opener. | ||
| 767 | (c-put-font-lock-face (nth 8 s) (point) font-lock-warning-face) | ||
| 768 | ;; Move to end of comment or LIMIT. | ||
| 769 | (setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table)) | ||
| 770 | ;; Fontify an invalid block comment ender, if that's what we have. | ||
| 771 | (when (and (not c-block-comment-flag) | ||
| 772 | (not (nth 4 s))) ; We're outside the comment | ||
| 773 | (c-put-font-lock-face (- (point) (length c-block-comment-ender)) | ||
| 774 | (point) font-lock-warning-face))))))) | ||
| 775 | nil) | ||
| 776 | |||
| 718 | (c-lang-defconst c-basic-matchers-before | 777 | (c-lang-defconst c-basic-matchers-before |
| 719 | "Font lock matchers for basic keywords, labels, references and various | 778 | "Font lock matchers for basic keywords, labels, references and various |
| 720 | other easily recognizable things that should be fontified before generic | 779 | other easily recognizable things that should be fontified before generic |
diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el index 60ad42f24f4..273174e0413 100644 --- a/lisp/progmodes/cc-vars.el +++ b/lisp/progmodes/cc-vars.el | |||
| @@ -1751,6 +1751,14 @@ variables.") | |||
| 1751 | c-macro-names-with-semicolon: %s" | 1751 | c-macro-names-with-semicolon: %s" |
| 1752 | c-macro-names-with-semicolon)))))) | 1752 | c-macro-names-with-semicolon)))))) |
| 1753 | 1753 | ||
| 1754 | (defcustom c-mark-wrong-style-of-comment nil | ||
| 1755 | "Fontify \"invalid\" comment delims with `font-lock-warning-face' if non-nil. | ||
| 1756 | \"Invalid\" means a line comment when the default comment style (set by | ||
| 1757 | `c-toggle-comment-style') is block, or a block comment otherwise." | ||
| 1758 | :type 'boolean | ||
| 1759 | :group 'c | ||
| 1760 | :version 27.1) | ||
| 1761 | |||
| 1754 | (defvar c-file-style nil | 1762 | (defvar c-file-style nil |
| 1755 | "Variable interface for setting style via File Local Variables. | 1763 | "Variable interface for setting style via File Local Variables. |
| 1756 | In a file's Local Variable section, you can set this variable to a | 1764 | In a file's Local Variable section, you can set this variable to a |