[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 6bd817e: Fix problems in CC Mode with " being enter
From: |
Alan Mackenzie |
Subject: |
[Emacs-diffs] master 6bd817e: Fix problems in CC Mode with " being entered into a comment at EOB. |
Date: |
Tue, 23 Jul 2019 05:58:09 -0400 (EDT) |
branch: master
commit 6bd817ee66e7a5759ef6c5a8c12d57b5ec59043c
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>
Fix problems in CC Mode with " being entered into a comment at EOB.
* lisp/progmodes/cc-engine.el (c-full-lit-near-cache): Amend the definition
such that an element's END element will be nil if the pertinent literal is
open at EOB.
(c-full-pp-to-literal): Before setting the aforementioned END element, check
that we're no longer in a literal. (c-literal-limits): When
c-full-pp-to-literal returns a list with a nil END element, replace this by
(point-max) to keep the interface of c-literal-limits unchanged.
* lisp/progmodes/cc-mode.el (c-after-change-mark-abnormal-strings): Having
found a string quote, check it is not inside an unterminated comment (i.e.
one
at EOB).
---
lisp/progmodes/cc-engine.el | 29 ++++++++++++++++++++---------
lisp/progmodes/cc-mode.el | 4 +++-
2 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index e7bae0e..a89528d 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -2977,6 +2977,7 @@ comment at the start of cc-engine.el for more info."
;; element is a list (HERE STATE END)), where HERE is the buffer position the
;; function was called for, STATE is the `parse-partial-sexp' state there, and
;; END is the end of the literal enclosing HERE, if any, or nil otherwise.
+;; N.B. END will be nil if the literal ends at EOB without a delimiter.
(defun c-full-trim-near-cache ()
;; Remove stale entries in `c-full-lit-near-cache', i.e. those whose END
@@ -3045,7 +3046,8 @@ comment at the start of cc-engine.el for more info."
;; (STATE) otherwise,
;; where STATE is the parsing state at HERE, TYPE is the type of the literal
;; enclosing HERE, (one of 'string, 'c, 'c++) and (BEG . END) is the
- ;; boundaries of that literal (including the delimiters).
+ ;; boundaries of that literal (including the delimiters), with END being nil
+ ;; if there is no end delimiter (i.e. the literal ends at EOB).
;;
;; Unless NOT-IN-DELIMITER is non-nil, when TO is inside a two-character
;; comment opener, this is recognized as being in a comment literal.
@@ -3064,6 +3066,7 @@ comment at the start of cc-engine.el for more info."
(base (car elt))
(near-base base)
(s (cadr elt))
+ s1
(end (car (cddr elt)))
far-base-and-state far-base far-s ty start)
(if (or
@@ -3104,12 +3107,17 @@ comment at the start of cc-engine.el for more info."
(t 'c)))
(setq start (nth 8 s))
(unless end
- (parse-partial-sexp here (point-max)
- nil ; TARGETDEPTH
- nil ; STOPBEFORE
- s ; OLDSTATE
- 'syntax-table) ; stop at end of literal
- (setq end (point)))
+ (setq s1 (parse-partial-sexp here (point-max)
+ nil ; TARGETDEPTH
+ nil ; STOPBEFORE
+ s ; OLDSTATE
+ 'syntax-table)); stop at EO literal
+ (unless (or (nth 3 s1) ; still in a string
+ (and (nth 4 s1)
+ (not (eq (nth 7 s1) 'syntax-table)))) ; still
+ ; in a
+ ; comment
+ (setq end (point))))
(unless (eq near-base here)
(c-full-put-near-cache-entry here s end))
(list s ty (cons start end)))
@@ -5555,8 +5563,11 @@ comment at the start of cc-engine.el for more info."
s
'syntax-table)
(point)))))
- (let ((pp-to-lit (c-full-pp-to-literal pos not-in-delimiter)))
- (car (cddr pp-to-lit))))))
+ (let* ((pp-to-lit (c-full-pp-to-literal pos not-in-delimiter))
+ (limits (car (cddr pp-to-lit))))
+ (if (and limits (null (cdr limits)))
+ (cons (car limits) (point-max))
+ limits)))))
(cond
(lit-limits)
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index a5e1589..5e373b6 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -1527,7 +1527,9 @@ Note that the style variables are always made local to
the buffer."
(or (not (nth 3 s))
(not (memq (char-before) c-string-delims))))))
;; We're at the start of a string.
- (memq (char-before) c-string-delims)))
+ (and (memq (char-before) c-string-delims)
+ (not (nth 4 s))))) ; Check we're actually out of the
+ ; comment. not stuck at EOB
(unless (and (c-major-mode-is 'c++-mode)
(c-maybe-re-mark-raw-string))
(if (c-unescaped-nls-in-string-p (1- (point)))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 6bd817e: Fix problems in CC Mode with " being entered into a comment at EOB.,
Alan Mackenzie <=