aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorAlan Mackenzie2019-11-09 12:09:30 +0000
committerAlan Mackenzie2019-11-09 12:09:30 +0000
commitb293aa91bcc7f553ffbc6c67027f3c86d06ffbd7 (patch)
tree39f019da4ce7a41d1367c01f590487b529bad2a3 /lisp
parent6daa80d04e575a27f53f60f5fafd7fcba39b4b2a (diff)
downloademacs-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')
-rw-r--r--lisp/progmodes/cc-cmds.el10
-rw-r--r--lisp/progmodes/cc-defs.el7
-rw-r--r--lisp/progmodes/cc-fonts.el61
-rw-r--r--lisp/progmodes/cc-vars.el8
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.
224On 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.
224The current point is used if POINT isn't specified. POSITION can be 231The 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
720other easily recognizable things that should be fontified before generic 779other 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.")
1751c-macro-names-with-semicolon: %s" 1751c-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.
1756In a file's Local Variable section, you can set this variable to a 1764In a file's Local Variable section, you can set this variable to a