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:
parent
888ffd960c
commit
7ceb45f61f
@ -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.
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user