mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Handle arbitrarily long C++ member initialisation lists.
* progmodes/cc-engine.el (c-back-over-member-initializers): new
function.
(c-guess-basic-syntax): New CASE 5R (extracted from 5B) to handle
(most) member init lists.
This commit is contained in:
parent
5147fc1773
commit
3d1c39faa4
2 changed files with 76 additions and 10 deletions
|
|
@ -6475,6 +6475,52 @@ comment at the start of cc-engine.el for more info."
|
|||
(c-go-list-forward)
|
||||
t)))
|
||||
|
||||
(defun c-back-over-member-initializers ()
|
||||
;; Test whether we are in a C++ member initializer list, and if so, go back
|
||||
;; to the introducing ":", returning the position of the opening paren of
|
||||
;; the function's arglist. Otherwise return nil, leaving point unchanged.
|
||||
(let ((here (point))
|
||||
(paren-state (c-parse-state))
|
||||
res)
|
||||
|
||||
(setq res
|
||||
(catch 'done
|
||||
(if (not (c-at-toplevel-p))
|
||||
(progn
|
||||
(while (not (c-at-toplevel-p))
|
||||
(goto-char (c-pull-open-brace paren-state)))
|
||||
(c-backward-syntactic-ws)
|
||||
(when (not (c-simple-skip-symbol-backward))
|
||||
(throw 'done nil))
|
||||
(c-backward-syntactic-ws))
|
||||
(c-backward-syntactic-ws)
|
||||
(when (memq (char-before) '(?\) ?}))
|
||||
(when (not (c-go-list-backward))
|
||||
(throw 'done nil))
|
||||
(c-backward-syntactic-ws))
|
||||
(when (c-simple-skip-symbol-backward)
|
||||
(c-backward-syntactic-ws)))
|
||||
|
||||
(while (eq (char-before) ?,)
|
||||
(backward-char)
|
||||
(c-backward-syntactic-ws)
|
||||
|
||||
(when (not (memq (char-before) '(?\) ?})))
|
||||
(throw 'done nil))
|
||||
(when (not (c-go-list-backward))
|
||||
(throw 'done nil))
|
||||
(c-backward-syntactic-ws)
|
||||
(when (not (c-simple-skip-symbol-backward))
|
||||
(throw 'done nil))
|
||||
(c-backward-syntactic-ws))
|
||||
|
||||
(and
|
||||
(eq (char-before) ?:)
|
||||
(c-just-after-func-arglist-p))))
|
||||
|
||||
(or res (goto-char here))
|
||||
res))
|
||||
|
||||
|
||||
;; Handling of large scale constructs like statements and declarations.
|
||||
|
||||
|
|
@ -9677,18 +9723,13 @@ comment at the start of cc-engine.el for more info."
|
|||
;; 2007-11-09)
|
||||
))))
|
||||
|
||||
;; CASE 5B: After a function header but before the body (or
|
||||
;; the ending semicolon if there's no body).
|
||||
;; CASE 5R: Member init list. (Used to be part of CASE 5B.1)
|
||||
;; Note there is no limit on the backward search here, since member
|
||||
;; init lists can, in practice, be very large.
|
||||
((save-excursion
|
||||
(when (setq placeholder (c-just-after-func-arglist-p
|
||||
(max lim (c-determine-limit 500))))
|
||||
(when (setq placeholder (c-back-over-member-initializers))
|
||||
(setq tmp-pos (point))))
|
||||
(cond
|
||||
|
||||
;; CASE 5B.1: Member init list.
|
||||
((eq (char-after tmp-pos) ?:)
|
||||
(if (or (>= tmp-pos indent-point)
|
||||
(= (c-point 'bosws) (1+ tmp-pos)))
|
||||
(if (= (c-point 'bosws) (1+ tmp-pos))
|
||||
(progn
|
||||
;; There is no preceding member init clause.
|
||||
;; Indent relative to the beginning of indentation
|
||||
|
|
@ -9701,6 +9742,23 @@ comment at the start of cc-engine.el for more info."
|
|||
(c-forward-syntactic-ws)
|
||||
(c-add-syntax 'member-init-cont (point))))
|
||||
|
||||
;; CASE 5B: After a function header but before the body (or
|
||||
;; the ending semicolon if there's no body).
|
||||
((save-excursion
|
||||
(when (setq placeholder (c-just-after-func-arglist-p
|
||||
(max lim (c-determine-limit 500))))
|
||||
(setq tmp-pos (point))))
|
||||
(cond
|
||||
|
||||
;; CASE 5B.1: Member init list.
|
||||
((eq (char-after tmp-pos) ?:)
|
||||
;; There is no preceding member init clause.
|
||||
;; Indent relative to the beginning of indentation
|
||||
;; for the topmost-intro line that contains the
|
||||
;; prototype's open paren.
|
||||
(goto-char placeholder)
|
||||
(c-add-syntax 'member-init-intro (c-point 'boi)))
|
||||
|
||||
;; CASE 5B.2: K&R arg decl intro
|
||||
((and c-recognize-knr-p
|
||||
(c-in-knr-argdecl lim))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue