summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Mackenzie <acm@muc.de>2020-02-16 12:14:41 +0000
committerAlan Mackenzie <acm@muc.de>2020-02-16 12:14:41 +0000
commit7ceb45f61f91d99c045966d8463c8ae30add8930 (patch)
treea18e2b43bd88e0af6dbf424e3778ca7ac7d5e701
parent888ffd960c06d56a409a7ff15b1d930d25c56089 (diff)
downloademacs-7ceb45f61f91d99c045966d8463c8ae30add8930.tar.gz
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.
-rw-r--r--lisp/progmodes/cc-engine.el58
-rw-r--r--lisp/progmodes/cc-langs.el36
2 files changed, 38 insertions, 56 deletions
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 23fb1effdd4..0964c04b899 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 667561719cb..e7e7cfd4b09 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.