summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog18
-rw-r--r--lisp/progmodes/cc-defs.el2
-rw-r--r--lisp/progmodes/cc-engine.el32
-rw-r--r--lisp/progmodes/cc-mode.el14
4 files changed, 53 insertions, 13 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index a1776062cda..134ae96895a 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,21 @@
+2010-06-21 Alan Mackenzie <bug-cc-mode@gnu.org>
+
+ Fix an indentation bug:
+
+ * progmodes/cc-mode.el (c-common-init): Initialise c-new-BEG/END.
+ (c-neutralize-syntax-in-and-mark-CPP): c-new-BEG/END: Take account
+ of existing values.
+
+ * progmodes/cc-engine.el (c-clear-<-pair-props-if-match-after)
+ (c-clear->-pair-props-if-match-before): now return t when they've
+ cleared properties, nil otherwise.
+ (c-before-change-check-<>-operators): Set c-new-beg/end correctly
+ by taking account of the existing value.
+
+ * progmodes/cc-defs.el
+ (c-clear-char-property-with-value-function): Fix this to clear the
+ property rather than overwriting it with nil.
+
2010-06-20 Chong Yidong <cyd@stupidchicken.com>
* emacs-lisp/package.el (package-print-package): Add link to
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index 7eb0016ff43..e5e108106f1 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -1082,7 +1082,7 @@ been put there by c-put-char-property. POINT remains unchanged."
(setq place (next-single-property-change place property nil to)))
(< place to))
(setq end-place (next-single-property-change place property nil to))
- (put-text-property place end-place property nil)
+ (remove-text-properties place end-place (cons property nil))
;; Do we have to do anything with stickiness here?
(setq place end-place))))
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 1ee3c295fe1..9bbf82a0449 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -4985,7 +4985,8 @@ comment at the start of cc-engine.el for more info."
;; 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.
+ ;; the current > and its partner. Return t when this happens, nil
+ ;; when it doesn't.
(save-excursion
(if pos
(goto-char pos)
@@ -4998,13 +4999,15 @@ 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))
+ t)))
(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.
+ ;; the current < and its partner. Return t when this happens, nil
+ ;; when it doesn't.
(save-excursion
(if pos
(goto-char pos)
@@ -5017,7 +5020,8 @@ 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-unmark-<->-as-paren pos)))))
+ (c-unmark-<->-as-paren pos))
+ t)))
(defun c-before-change-check-<>-operators (beg end)
;; Unmark certain pairs of "< .... >" which are currently marked as
@@ -5040,25 +5044,39 @@ comment at the start of cc-engine.el for more info."
;; 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))))
+ (end-lit-limits (progn (goto-char end) (c-literal-limits)))
+ new-beg new-end need-new-beg need-new-end)
;; 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)))
+ (setq new-beg (point))
;; 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))))
+ (if (c-clear-<-pair-props-if-match-after beg (1- (point)))
+ (setq need-new-beg t)))
;; 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)
+ (setq new-end (point))
;; 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)))))
+ (if (c-clear->-pair-props-if-match-before end)
+ (setq need-new-end t)))
+
+ ;; Extend the fontification region, if needed.
+ (when need-new-beg
+ (goto-char new-beg)
+ (c-forward-syntactic-ws)
+ (and (< (point) c-new-BEG) (setq c-new-BEG (point))))
+
+ (when need-new-end
+ (and (> new-end c-new-END) (setq c-new-END new-end))))))
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index ed17e6f34e6..9044b42a838 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -640,6 +640,8 @@ compatible with old code; callers should always specify it."
;; Starting a mode is a sort of "change". So call the change functions...
(save-restriction
(widen)
+ (setq c-new-BEG (point-min))
+ (setq c-new-END (point-max))
(save-excursion
(if c-get-state-before-change-functions
(mapc (lambda (fn)
@@ -886,17 +888,19 @@ Note that the style variables are always made local to the buffer."
;; inside a string, comment, or macro.
(goto-char c-old-BOM) ; already set to old start of macro or begg.
(setq c-new-BEG
- (if (setq limits (c-state-literal-at (point)))
- (cdr limits) ; go forward out of any string or comment.
- (point)))
+ (min c-new-BEG
+ (if (setq limits (c-state-literal-at (point)))
+ (cdr limits) ; go forward out of any string or comment.
+ (point))))
(goto-char endd)
(if (setq limits (c-state-literal-at (point)))
(goto-char (car limits))) ; go backward out of any string or comment.
(if (c-beginning-of-macro)
(c-end-of-macro))
- (setq c-new-END (max (+ (- c-old-EOM old-len) (- endd begg))
- (point)))
+ (setq c-new-END (max c-new-END
+ (+ (- c-old-EOM old-len) (- endd begg))
+ (point)))
;; Clear all old relevant properties.
(c-clear-char-property-with-value c-new-BEG c-new-END 'syntax-table '(1))