emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-27 7ceb45f: Reformulate c-end-of-macro, handling multiline block c


From: Alan Mackenzie
Subject: emacs-27 7ceb45f: Reformulate c-end-of-macro, handling multiline block comments better
Date: Sun, 16 Feb 2020 07:17:08 -0500 (EST)

branch: emacs-27
commit 7ceb45f61f91d99c045966d8463c8ae30add8930
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>

    Reformulate c-end-of-macro, handling multiline block comments better
    
    * lisp/progmodes/cc-langs.el (c-last-open-c-comment-start-on-line-re): 
Comment
    out.
    (c-open-c-comment-on-logical-line-re): Remove.
    
    * lisp/progmodes/cc-engine.el (c-end-of-macro): Handle multiline block
    comments lacking escaped newlines using parse-partial-sexp rather than the
    former variables removed from cc-langs.el.
---
 lisp/progmodes/cc-engine.el | 58 ++++++++++++++++++++++-----------------------
 lisp/progmodes/cc-langs.el  | 36 ++++++++--------------------
 2 files changed, 38 insertions(+), 56 deletions(-)

diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 23fb1ef..0964c04 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -358,7 +358,8 @@ comment at the start of cc-engine.el for more info."
   "Go to the end of a preprocessor directive.
 More accurately, move the point to the end of the closest following
 line that doesn't end with a line continuation backslash - no check is
-done that the point is inside a cpp directive to begin with.
+done that the point is inside a cpp directive to begin with, although
+it is assumed that point isn't inside a comment or string.
 
 If LIM is provided, it is a limit position at which point is left
 if the end of the macro doesn't occur earlier.
@@ -379,35 +380,32 @@ comment at the start of cc-engine.el for more info."
              c-macro-cache-syntactic nil
              c-macro-cache-no-comment nil))
       (save-match-data
-       (while
-           (progn
-             (while (progn
-                      (end-of-line)
-                      (when (and (eq (char-before) ?\\)
-                                 (not (eobp)))
-                        (forward-char)
-                        t)))
-             (let ((cand-EOM (point)))
-               (if (and c-open-c-comment-on-logical-line-re
-                        (re-search-backward
-                         c-open-c-comment-on-logical-line-re
-                         nil t)
-                        (match-beginning 1)
-                        (progn
-                          (goto-char (match-beginning 1))
-                          (and (c-forward-single-comment)
-                               (> (point) cand-EOM))))
-                   t
-                 (goto-char cand-EOM)
-                 nil)))))
-
-      (when (and (car c-macro-cache)
-                (> (point) (car c-macro-cache)) ; in case we have a
-                                                ; zero-sized region.
-                (bolp)
-                (not (eq (char-before (1- (point))) ?\\)))
-       (setcdr c-macro-cache (point))
-       (setq c-macro-cache-syntactic nil)))))
+       (let ((safe-pos (point)))       ; a point ouside any literal.
+         ;; Move over stuff followed by a multiline block comment lacking
+         ;; escaped newlines each time around this loop.
+         (while
+             (progn
+               (while (progn
+                        (end-of-line)
+                        (when (and (eq (char-before) ?\\)
+                                   (not (eobp)))
+                          (forward-char)
+                          t)))
+               (let ((s (parse-partial-sexp safe-pos (point))))
+                 (when ;; Are we in a block comment?
+                     (and (nth 4 s) (not (nth 7 s)))
+                   (progn
+                     ;; Move to after the block comment.
+                     (parse-partial-sexp
+                      (point) (point-max) nil nil s 'syntax-table)
+                     (setq safe-pos (point)))))))
+
+         (when (and (car c-macro-cache)
+                    (> (point) (car c-macro-cache)) ; in case we have a
+                                       ; zero-sized region.
+                    (not (eq (char-before (1- (point))) ?\\)))
+           (setcdr c-macro-cache (point))
+           (setq c-macro-cache-syntactic nil)))))))
 
 (defun c-syntactic-end-of-macro ()
   ;; Go to the end of a CPP directive, or a "safe" pos just before.
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index 6675617..e7e7cfd 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -1706,32 +1706,16 @@ ender."
 (c-lang-defvar c-last-c-comment-end-on-line-re
               (c-lang-const c-last-c-comment-end-on-line-re))
 
-(c-lang-defconst c-last-open-c-comment-start-on-line-re
-  "Do NOT use this constant any more.  Instead use
-`c-open-c-comment-on-logical-line-re' (2020-02-10).
-
-Regexp which matches the last block comment start on the
-current ine, if any, or nil in those languages without block
-comments.  When a match is found, submatch 1 contains the comment
-starter."
-  t "\\(/\\*\\)\\([^*]\\|\\*+\\([^*/]\\|$\\)\\)*$"
-  awk nil)
-(c-lang-defvar c-last-open-c-comment-start-on-line-re
-              (c-lang-const c-last-open-c-comment-start-on-line-re))
-(make-obsolete-variable 'c-last-open-c-comment-start-on-line-re
-                       'c-open-c-comment-on-logical-line-re
-                       "5.35")
-
-(c-lang-defconst c-open-c-comment-on-logical-line-re
-  "Regexp which matches an open block comment on the current logical line.
-It is intended for searching backwards from the end of a line.
-Such a search will stop at the first encountered non-escaped
-newline or open block comment.  If the comment is found, submatch
-1 contains the comment starter."
-t "[^\\\n][\r\n]\\|\\(/\\*\\)\\([^*]\\|\\*+\\([^*/]\\|$\\)\\)*$"
-awk nil)
-(c-lang-defvar c-open-c-comment-on-logical-line-re
-              (c-lang-const c-open-c-comment-on-logical-line-re))
+;; The following is no longer used (2020-02-16).
+;; (c-lang-defconst c-last-open-c-comment-start-on-line-re
+;;   "Regexp which matches the last block comment start on the
+;; current ine, if any, or nil in those languages without block
+;; comments.  When a match is found, submatch 1 contains the comment
+;; starter."
+;;   t "\\(/\\*\\)\\([^*]\\|\\*+\\([^*/]\\|$\\)\\)*$"
+;;   awk nil)
+;; (c-lang-defvar c-last-open-c-comment-start-on-line-re
+;;   (c-lang-const c-last-open-c-comment-start-on-line-re))
 
 (c-lang-defconst c-literal-start-regexp
   ;; Regexp to match the start of comments and string literals.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]