1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-24 07:20:37 +00:00

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.
This commit is contained in:
Alan Mackenzie 2020-02-16 12:14:41 +00:00
parent 888ffd960c
commit 7ceb45f61f
2 changed files with 37 additions and 55 deletions

View File

@ -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)))))
(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.
(bolp)
(not (eq (char-before (1- (point))) ?\\)))
(setcdr c-macro-cache (point))
(setq c-macro-cache-syntactic nil)))))
(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.

View File

@ -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.