Skip to content

Commit

Permalink
C++ Mode: Handle new keywords static_cast, etc., wrt angle brackets
Browse files Browse the repository at this point in the history
* lisp/progmodes/cc-langs.el (c-<>-arglist-kwds): Add const_cast,
dynamic_cast, reinterpret_cast and static_cast into this lang const.

* lisp/progmodes/cc-engine.el (c-clear-<-pair-props, c-clear->-pair-props)
(c-clear-<-pair-props-if-match-after, c-clear->-pair-props-if-match-before)
(c-forward-<>-arglist-recur):
Invalidate caches with c-trunctate-lit-pos-cache.
(c-forward-<>-arglist-recur): If in a matching <...> expression, the < has a
syntax-table property, but the > not, remove that property.
  • Loading branch information
Alan Mackenzie committed Jun 27, 2021
1 parent 7722b51 commit ef5f3d5
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 8 deletions.
33 changes: 26 additions & 7 deletions lisp/progmodes/cc-engine.el
Original file line number Diff line number Diff line change
Expand Up @@ -6868,8 +6868,10 @@ comment at the start of cc-engine.el for more info."
(c-go-list-forward))
(when (equal (c-get-char-property (1- (point)) 'syntax-table)
c->-as-paren-syntax) ; should always be true.
(c-unmark-<->-as-paren (1- (point))))
(c-unmark-<->-as-paren pos))))
(c-unmark-<->-as-paren (1- (point)))
(c-truncate-lit-pos-cache (1- (point))))
(c-unmark-<->-as-paren pos)
(c-truncate-lit-pos-cache pos))))

(defun c-clear->-pair-props (&optional pos)
;; POS (default point) is at a > character. If it is marked with
Expand All @@ -6885,8 +6887,10 @@ comment at the start of cc-engine.el for more info."
(c-go-up-list-backward))
(when (equal (c-get-char-property (point) 'syntax-table)
c-<-as-paren-syntax) ; should always be true.
(c-unmark-<->-as-paren (point)))
(c-unmark-<->-as-paren pos))))
(c-unmark-<->-as-paren (point))
(c-truncate-lit-pos-cache (point)))
(c-unmark-<->-as-paren pos)
(c-truncate-lit-pos-cache pos))))

(defun c-clear-<>-pair-props (&optional pos)
;; POS (default point) is at a < or > character. If it has an
Expand Down Expand Up @@ -6919,7 +6923,8 @@ comment at the start of cc-engine.el for more info."
(equal (c-get-char-property (1- (point)) 'syntax-table)
c->-as-paren-syntax)) ; should always be true.
(c-unmark-<->-as-paren (1- (point)))
(c-unmark-<->-as-paren pos))
(c-unmark-<->-as-paren pos)
(c-truncate-lit-pos-cache pos))
t)))

(defun c-clear->-pair-props-if-match-before (lim &optional pos)
Expand All @@ -6940,6 +6945,7 @@ comment at the start of cc-engine.el for more info."
(equal (c-get-char-property (point) 'syntax-table)
c-<-as-paren-syntax)) ; should always be true.
(c-unmark-<->-as-paren (point))
(c-truncate-lit-pos-cache (point))
(c-unmark-<->-as-paren pos))
t)))

Expand Down Expand Up @@ -7980,13 +7986,14 @@ comment at the start of cc-engine.el for more info."
;; bracket arglist. It's propagated through the return value
;; on successful completion.
(c-record-found-types c-record-found-types)
(syntax-table-prop-on-< (c-get-char-property (point) 'syntax-table))
;; List that collects the positions after the argument
;; separating ',' in the arglist.
arg-start-pos)
;; If the '<' has paren open syntax then we've marked it as an angle
;; bracket arglist before, so skip to the end.
(if (and (not c-parse-and-markup-<>-arglists)
(c-get-char-property (point) 'syntax-table))
syntax-table-prop-on-<)

(progn
(forward-char)
Expand Down Expand Up @@ -8071,8 +8078,20 @@ comment at the start of cc-engine.el for more info."
(c-put-c-type-property (1- (car arg-start-pos))
'c-<>-arg-sep)
(setq arg-start-pos (cdr arg-start-pos)))
(when (and (not syntax-table-prop-on-<)
(c-get-char-property (1- (point))
'syntax-table))
;; Clear the now spuriously matching < of its
;; syntax-table property. This could happen on
;; inserting "_cast" into "static <" with C-y.
(save-excursion
(and (c-go-list-backward)
(eq (char-after) ?<)
(c-truncate-lit-pos-cache (point))
(c-unmark-<->-as-paren (point)))))
(c-mark-<-as-paren start)
(c-mark->-as-paren (1- (point))))
(c-mark->-as-paren (1- (point)))
(c-truncate-lit-pos-cache start))
(setq res t)
nil)) ; Exit the loop.

Expand Down
3 changes: 2 additions & 1 deletion lisp/progmodes/cc-langs.el
Original file line number Diff line number Diff line change
Expand Up @@ -2719,7 +2719,8 @@ if this isn't nil."
`c-recognize-<>-arglists' for details. That language constant is
assumed to be set if this isn't nil."
t nil
c++ '("template")
c++ '("template" "const_cast" "dynamic_cast" "reinterpret_cast"
"static_cast")
idl '("fixed" "string" "wstring"))

(c-lang-defconst c-<>-sexp-kwds
Expand Down

0 comments on commit ef5f3d5

Please sign in to comment.