summaryrefslogtreecommitdiff
path: root/lisp/progmodes/cc-engine.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/progmodes/cc-engine.el')
-rw-r--r--lisp/progmodes/cc-engine.el171
1 files changed, 3 insertions, 168 deletions
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 3b7f6e4ea0a..9d0af1d53ce 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -4880,168 +4880,7 @@ comment at the start of cc-engine.el for more info."
)))
-;; Setting and removing syntax properties on < and > in languages (C++
-;; and Java) where they can be template/generic delimiters as well as
-;; their normal meaning of "less/greater than".
-
-;; Normally, < and > have syntax 'punctuation'. When they are found to
-;; be delimiters, they are marked as such with the category properties
-;; c-<-as-paren-syntax, c->-as-paren-syntax respectively.
-
-;; STRATEGY:
-;;
-;; It is impossible to determine with certainty whether a <..> pair in
-;; C++ is two comparison operators or is template delimiters, unless
-;; one duplicates a lot of a C++ compiler. For example, the following
-;; code fragment:
-;;
-;; foo (a < b, c > d) ;
-;;
-;; could be a function call with two integer parameters (each a
-;; relational expression), or it could be a constructor for class foo
-;; taking one parameter d of templated type "a < b, c >". They are
-;; somewhat easier to distinguish in Java.
-;;
-;; The strategy now (2010-01) adopted is to mark and unmark < and
-;; > IN MATCHING PAIRS ONLY. [Previously, they were marked
-;; individually when their context so indicated. This gave rise to
-;; intractible problems when one of a matching pair was deleted, or
-;; pulled into a literal.]
-;;
-;; At each buffer change, the syntax-table properties are removed in a
-;; before-change function and reapplied, when needed, in an
-;; after-change function. It is far more important that the
-;; properties get removed when they they are spurious than that they
-;; be present when wanted.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun c-clear-<-pair-props (&optional pos)
- ;; POS (default point) is at a < character. If it is marked with
- ;; open paren syntax-table text property, remove the property,
- ;; together with the close paren property on the matching > (if
- ;; any).
- (save-excursion
- (if pos
- (goto-char pos)
- (setq pos (point)))
- (when (equal (c-get-char-property (point) 'syntax-table)
- c-<-as-paren-syntax)
- (with-syntax-table c-no-parens-syntax-table ; ignore unbalanced [,{,(,..
- (c-go-list-forward))
- (when (equal (c-get-char-property (1- (point)) 'syntax-table)
- c->-as-paren-syntax) ; should always be true.
- (c-clear-char-property (1- (point)) 'syntax-table))
- (c-clear-char-property pos 'syntax-table))))
-
-(defun c-clear->-pair-props (&optional pos)
- ;; POS (default point) is at a > character. If it is marked with
- ;; close paren syntax-table property, remove the property, together
- ;; with the open paren property on the matching < (if any).
- (save-excursion
- (if pos
- (goto-char pos)
- (setq pos (point)))
- (when (equal (c-get-char-property (point) 'syntax-table)
- c->-as-paren-syntax)
- (with-syntax-table c-no-parens-syntax-table ; ignore unbalanced [,{,(,..
- (c-go-up-list-backward))
- (when (equal (c-get-char-property (point) 'syntax-table)
- c-<-as-paren-syntax) ; should always be true.
- (c-clear-char-property (point) 'syntax-table))
- (c-clear-char-property pos 'syntax-table))))
-
-(defun c-clear-<>-pair-props (&optional pos)
- ;; POS (default point) is at a < or > character. If it has an
- ;; open/close paren syntax-table property, remove this property both
- ;; from the current character and its partner (which will also be
- ;; thusly marked).
- (cond
- ((eq (char-after) ?\<)
- (c-clear-<-pair-props pos))
- ((eq (char-after) ?\>)
- (c-clear->-pair-props pos))
- (t (c-benign-error
- "c-clear-<>-pair-props called from wrong position"))))
-
-(defun c-clear-<-pair-props-if-match-after (lim &optional pos)
- ;; POS (default point) is at a < character. If it is both marked
- ;; with open/close paren syntax-table property, and has a matching >
- ;; (also marked) which is after LIM, remove the property both from
- ;; the current > and its partner.
- (save-excursion
- (if pos
- (goto-char pos)
- (setq pos (point)))
- (when (equal (c-get-char-property (point) 'syntax-table)
- c-<-as-paren-syntax)
- (with-syntax-table c-no-parens-syntax-table ; ignore unbalanced [,{,(,..
- (c-go-list-forward))
- (when (and (>= (point) lim)
- (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)))))
-
-(defun c-clear->-pair-props-if-match-before (lim &optional pos)
- ;; POS (default point) is at a > character. If it is both marked
- ;; with open/close paren syntax-table property, and has a matching <
- ;; (also marked) which is before LIM, remove the property both from
- ;; the current < and its partner.
- (save-excursion
- (if pos
- (goto-char pos)
- (setq pos (point)))
- (when (equal (c-get-char-property (point) 'syntax-table)
- c->-as-paren-syntax)
- (with-syntax-table c-no-parens-syntax-table ; ignore unbalanced [,{,(,..
- (c-go-up-list-backward))
- (when (and (<= (point) lim)
- (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)))))
-
-(defun c-before-change-check-<>-operators (beg end)
- ;; Unmark certain pairs of "< .... >" which are currently marked as
- ;; template/generic delimiters. (This marking is via syntax-table
- ;; text properties).
- ;;
- ;; These pairs are those which are in the current "statement" (i.e.,
- ;; the region between the {, }, or ; before BEG and the one after
- ;; END), and which enclose any part of the interval (BEG END).
- ;;
- ;; Note that in C++ (?and Java), template/generic parens cannot
- ;; enclose a brace or semicolon, so we use these as bounds on the
- ;; region we must work on.
- ;;
- ;; This function is called from before-change-functions (via
- ;; c-get-state-before-change-functions). Thus the buffer is widened,
- ;; and point is undefined, both at entry and exit.
- ;;
- ;; FIXME!!! This routine ignores the possibility of macros entirely.
- ;; 2010-01-29.
- (save-excursion
- (let ((beg-lit-limits (progn (goto-char beg) (c-literal-limits)))
- (end-lit-limits (progn (goto-char end) (c-literal-limits))))
- ;; Locate the barrier before the changed region
- (goto-char (if beg-lit-limits (car beg-lit-limits) beg))
- (c-syntactic-skip-backward "^;{}" (max (- beg 2048) (point-min)))
-
- ;; Remove the syntax-table properties from each pertinent <...> pair.
- ;; Firsly, the ones with the < before beg and > after beg.
- (while (c-search-forward-char-property 'category 'c-<-as-paren-syntax beg)
- (c-clear-<-pair-props-if-match-after beg (1- (point))))
-
- ;; Locate the barrier after END.
- (goto-char (if end-lit-limits (cdr end-lit-limits) end))
- (c-syntactic-re-search-forward "[;{}]"
- (min (+ end 2048) (point-max)) 'end)
-
- ;; Remove syntax-table properties from the remaining pertinent <...>
- ;; pairs, those with a > after end and < before end.
- (while (c-search-backward-char-property 'category 'c->-as-paren-syntax end)
- (c-clear->-pair-props-if-match-before end)))))
-
-
+;; Handling of small scale constructs like types and names.
(defun c-after-change-check-<>-operators (beg end)
;; This is called from `after-change-functions' when
@@ -5063,7 +4902,7 @@ comment at the start of cc-engine.el for more info."
(< beg (setq beg (match-end 0))))
(while (progn (skip-chars-forward "^<>" beg)
(< (point) beg))
- (c-clear-<>-pair-props)
+ (c-clear-char-property (point) 'syntax-table)
(forward-char))))
(when (< beg end)
@@ -5078,13 +4917,9 @@ comment at the start of cc-engine.el for more info."
(< end (setq end (match-end 0))))
(while (progn (skip-chars-forward "^<>" end)
(< (point) end))
- (c-clear-<>-pair-props)
+ (c-clear-char-property (point) 'syntax-table)
(forward-char)))))))
-
-
-;; Handling of small scale constructs like types and names.
-
;; Dynamically bound variable that instructs `c-forward-type' to also
;; treat possible types (i.e. those that it normally returns 'maybe or
;; 'found for) as actual types (and always return 'found for them).