c-end-of-macro: Handle block coment lines with unescaped NLs correctly

* lisp/progmodes/cc-langs.el (c-last-open-c-comment-start-on-line-re): Make
obsolete, and supersede by ...
(c-open-c-comment-on-logical-line-re): New language variable.

* lisp/progmodes/cc-engine.el (c-end-of-macro): Inside macros, handle
multiline block comments whose line ends are not escaped correctly.
This commit is contained in:
Alan Mackenzie 2020-02-10 21:20:12 +00:00
parent 06c302d425
commit ad5e350ab7
2 changed files with 28 additions and 8 deletions

View file

@ -388,14 +388,17 @@ comment at the start of cc-engine.el for more info."
(forward-char) (forward-char)
t))) t)))
(let ((cand-EOM (point))) (let ((cand-EOM (point)))
(if (and c-last-open-c-comment-start-on-line-re (if (and c-open-c-comment-on-logical-line-re
(re-search-backward (re-search-backward
c-last-open-c-comment-start-on-line-re c-open-c-comment-on-logical-line-re
(c-point 'bol) t)) nil t)
(progn (match-beginning 1)
(goto-char (match-beginning 1)) (progn
(and (c-forward-single-comment) (goto-char (match-beginning 1))
(> (point) cand-EOM))) (and (c-forward-single-comment)
(> (point) cand-EOM))))
t
(goto-char cand-EOM)
nil))))) nil)))))
(when (and (car c-macro-cache) (when (and (car c-macro-cache)

View file

@ -1707,7 +1707,10 @@ ender."
(c-lang-const 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 (c-lang-defconst c-last-open-c-comment-start-on-line-re
"Regexp which matches the last block comment start on the "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 current ine, if any, or nil in those languages without block
comments. When a match is found, submatch 1 contains the comment comments. When a match is found, submatch 1 contains the comment
starter." starter."
@ -1715,6 +1718,20 @@ starter."
awk nil) awk nil)
(c-lang-defvar c-last-open-c-comment-start-on-line-re (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-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))
(c-lang-defconst c-literal-start-regexp (c-lang-defconst c-literal-start-regexp
;; Regexp to match the start of comments and string literals. ;; Regexp to match the start of comments and string literals.