]> git.eshelyaron.com Git - emacs.git/commitdiff
Fontify a CPP construct correctly when a comment follows without spaces
authorAlan Mackenzie <acm@muc.de>
Thu, 21 Dec 2017 17:49:14 +0000 (17:49 +0000)
committerAlan Mackenzie <acm@muc.de>
Thu, 21 Dec 2017 17:55:59 +0000 (17:55 +0000)
Do this by removing a broken optimization in the state cache which put
category text properties on a character between the end of the CPP construct
and the beginning of the comment.  This can't work when there's no such
character.

* lisp/progmodes/cc-defs.el (c-cpp-delimiter, c-set-cpp-delimiters)
(c-clear-cpp-delimiters, c-comment-out-cpps, c-with-cpps-commented-out)
(c-with-all-but-one-cpps-commented-out): Remove.

* lisp/progmodes/cc-engine.el (c-no-comment-end-of-macro): Return the comment
start position rather than one character before it.
(c-invalidate-state-cache, c-parse-state): Remove the invocations of
c-with-all-but-one-cpps-commented-out and c-with-cpps-commented-out.

* lisp/progmodes/cc-mode.el (c-neutralize-syntax-in-and-mark-CPP): Rename to
c-neutralize-syntax-in-CPP and remove the bits which applied category
properties.

* lisp/progmodes/cc-langs.el (c-before-font-lock-functions): Incorporate the
new name of the function c-neutralize-syntax-in-CPP.

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

index 973d97c256000c6772db83d7c9739f39dbc6061e..e837ce1973ba572e5a99a2e34fd3f4301af3ccc5 100644 (file)
@@ -1414,59 +1414,6 @@ with value CHAR in the region [FROM to)."
 
 ;;;;;;;;;;;;;;;
 
-(defconst c-cpp-delimiter '(14)) ; generic comment syntax
-;; This is the value of the `category' text property placed on every #
-;; which introduces a CPP construct and every EOL (or EOB, or character
-;; preceding //, etc.) which terminates it.  We can instantly "comment
-;; out" all CPP constructs by giving `c-cpp-delimiter' a syntax-table
-;; property '(14) (generic comment delimiter).
-(defmacro c-set-cpp-delimiters (beg end)
-  ;; This macro does a hidden buffer change.
-  `(progn
-     (c-put-char-property ,beg 'category 'c-cpp-delimiter)
-     (if (< ,end (point-max))
-        (c-put-char-property ,end 'category 'c-cpp-delimiter))))
-(defmacro c-clear-cpp-delimiters (beg end)
-  ;; This macro does a hidden buffer change.
-  `(progn
-     (c-clear-char-property ,beg 'category)
-     (if (< ,end (point-max))
-        (c-clear-char-property ,end 'category))))
-
-(defsubst c-comment-out-cpps ()
-  ;; Render all preprocessor constructs syntactically commented out.
-  (put 'c-cpp-delimiter 'syntax-table c-cpp-delimiter))
-(defsubst c-uncomment-out-cpps ()
-  ;; Restore the syntactic visibility of preprocessor constructs.
-  (put 'c-cpp-delimiter 'syntax-table nil))
-
-(defmacro c-with-cpps-commented-out (&rest forms)
-  ;; Execute FORMS... whilst the syntactic effect of all characters in
-  ;; all CPP regions is suppressed.  In particular, this is to suppress
-  ;; the syntactic significance of parens/braces/brackets to functions
-  ;; such as `scan-lists' and `parse-partial-sexp'.
-  `(unwind-protect
-       (c-save-buffer-state ()
-          (c-comment-out-cpps)
-          ,@forms)
-     (c-save-buffer-state ()
-       (c-uncomment-out-cpps))))
-
-(defmacro c-with-all-but-one-cpps-commented-out (beg end &rest forms)
-  ;; Execute FORMS... whilst the syntactic effect of all characters in
-  ;; every CPP region APART FROM THE ONE BETWEEN BEG and END is
-  ;; suppressed.
-  `(unwind-protect
-       (c-save-buffer-state ()
-        (save-restriction
-          (widen)
-          (c-clear-cpp-delimiters ,beg ,end))
-        ,`(c-with-cpps-commented-out ,@forms))
-     (c-save-buffer-state ()
-       (save-restriction
-        (widen)
-        (c-set-cpp-delimiters ,beg ,end)))))
-
 (defmacro c-self-bind-state-cache (&rest forms)
   ;; Bind the state cache to itself and execute the FORMS.  Return the result
   ;; of the last FORM executed.  It is assumed that no buffer changes will
index 12ec8f74fea4e82d7a16bf4773237474bbe1e9e0..7b9baee6f76d28c662b056c754baf9c7f3adeb63 100644 (file)
 ;; `c-macro-cache'.
 (defvar c-macro-cache-no-comment nil)
 (make-variable-buffer-local 'c-macro-cache-no-comment)
-;; Either nil, or the last character of the macro currently represented by
-;; `c-macro-cache' which isn't in a comment. */
+;; Either nil, or the position of a comment which is open at the end of the
+;; macro represented by `c-macro-cache'.
 
 (defun c-invalidate-macro-cache (beg _end)
   ;; Called from a before-change function.  If the change region is before or
@@ -382,8 +382,9 @@ comment at the start of cc-engine.el for more info."
     (point)))
 
 (defun c-no-comment-end-of-macro ()
-  ;; Go to the end of a CPP directive, or a pos just before which isn't in a
-  ;; comment.  For this purpose, open strings are ignored.
+  ;; Go to the start of the comment which is open at the end of the current
+  ;; CPP directive, or to the end of that directive.  For this purpose, open
+  ;; strings are ignored.
   ;;
   ;; This function must only be called from the beginning of a CPP construct.
   ;;
@@ -401,7 +402,7 @@ comment at the start of cc-engine.el for more info."
        (setq s (parse-partial-sexp here there)))
       (when (and (nth 4 s)
                 (not (eq (nth 7 s) 'syntax-table))) ; no pseudo comments.
-       (goto-char (1- (nth 8 s))))
+       (goto-char (nth 8 s)))
       (setq c-macro-cache-no-comment (point)))
     (point)))
 
@@ -3862,14 +3863,7 @@ comment at the start of cc-engine.el for more info."
   (if (eval-when-compile (memq 'category-properties c-emacs-features))
       ;; Emacs
       (c-with-<->-as-parens-suppressed
-       (if (and c-state-old-cpp-beg
-               (< c-state-old-cpp-beg here))
-          (c-with-all-but-one-cpps-commented-out
-           c-state-old-cpp-beg
-           c-state-old-cpp-end
-           (c-invalidate-state-cache-1 here))
-        (c-with-cpps-commented-out
-         (c-invalidate-state-cache-1 here))))
+       (c-invalidate-state-cache-1 here))
     ;; XEmacs
     (c-invalidate-state-cache-1 here)))
 
@@ -3902,12 +3896,7 @@ comment at the start of cc-engine.el for more info."
        (if (eval-when-compile (memq 'category-properties c-emacs-features))
            ;; Emacs
            (c-with-<->-as-parens-suppressed
-            (if (and here-cpp-beg (> here-cpp-end here-cpp-beg))
-                (c-with-all-but-one-cpps-commented-out
-                 here-cpp-beg here-cpp-end
-                 (c-parse-state-1))
-              (c-with-cpps-commented-out
-               (c-parse-state-1))))
+            (c-parse-state-1))
          ;; XEmacs
          (c-parse-state-1))
       (setq c-state-old-cpp-beg
index 169b61c3dd3526e5ae103238a39e5353f9827362..12a15873b1a0b9b5267b7debda6bf85818cea653 100644 (file)
@@ -518,13 +518,13 @@ parameters \(point-min) and \(point-max).")
   (c objc) '(c-depropertize-new-text
             c-parse-quotes-after-change
             c-extend-font-lock-region-for-macros
-            c-neutralize-syntax-in-and-mark-CPP
+            c-neutralize-syntax-in-CPP
             c-change-expand-fl-region)
   c++ '(c-depropertize-new-text
        c-parse-quotes-after-change
        c-extend-font-lock-region-for-macros
        c-after-change-re-mark-raw-strings
-       c-neutralize-syntax-in-and-mark-CPP
+       c-neutralize-syntax-in-CPP
        c-restore-<>-properties
        c-change-expand-fl-region)
   java '(c-depropertize-new-text
index 22dea039cd1e88e46a461d17ed4135ac617e58eb..4073a5a1b1a6611af48ab215ce33e7f1819fbc31 100644 (file)
@@ -1016,15 +1016,10 @@ Note that the style variables are always made local to the buffer."
              t)
             (t nil)))))))
 
-(defun c-neutralize-syntax-in-and-mark-CPP (_begg _endd _old-len)
-  ;; (i) "Neutralize" every preprocessor line wholly or partially in the
-  ;; changed region.  "Restore" lines which were CPP lines before the change
-  ;; and are no longer so.
-  ;;
-  ;; (ii) Mark each CPP construct by placing a `category' property value
-  ;; `c-cpp-delimiter' at its start and end.  The marked characters are the
-  ;; opening # and usually the terminating EOL, but sometimes the character
-  ;; before a comment delimiter.
+(defun c-neutralize-syntax-in-CPP (_begg _endd _old-len)
+  ;; "Neutralize" every preprocessor line wholly or partially in the changed
+  ;; region.  "Restore" lines which were CPP lines before the change and are
+  ;; no longer so.
   ;;
   ;; That is, set syntax-table properties on characters that would otherwise
   ;; interact syntactically with those outside the CPP line(s).
@@ -1044,12 +1039,7 @@ Note that the style variables are always made local to the buffer."
   (c-save-buffer-state (limits)
     ;; Clear 'syntax-table properties "punctuation":
     ;; (c-clear-char-property-with-value c-new-BEG c-new-END 'syntax-table '(1))
-
-    ;; CPP "comment" markers:
-    (if (eval-when-compile (memq 'category-properties c-emacs-features));Emacs.
-       (c-clear-char-property-with-value
-        c-new-BEG c-new-END 'category 'c-cpp-delimiter))
-    ;; FIXME!!!  What about the "<" and ">" category properties?  2009-11-16
+    ;; The above is now done in `c-depropertize-CPP'.
 
     ;; Add needed properties to each CPP construct in the region.
     (goto-char c-new-BEG)
@@ -1076,11 +1066,7 @@ Note that the style variables are always made local to the buffer."
          (goto-char (match-beginning 1))
          (setq mbeg (point))
          (if (> (c-no-comment-end-of-macro) mbeg)
-             (progn
-               (c-neutralize-CPP-line mbeg (point)) ; "punctuation" properties
-               (if (eval-when-compile
-                      (memq 'category-properties c-emacs-features)) ;Emacs.
-                   (c-set-cpp-delimiters mbeg (point)))) ; "comment" markers
+             (c-neutralize-CPP-line mbeg (point)) ; "punctuation" properties
            (forward-line))           ; no infinite loop with, e.g., "#//"
          )))))