From 691e26ae7d3b48f1cf23d87887da8d105b0f9516 Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Wed, 3 Apr 2013 17:50:39 +0000 Subject: [PATCH] Handle `parse-partial-sexp' landing inside a comment opener (Bug#13244). Also adapt to the new values of element 7 of a parse state. * progmodes/cc-engine.el (c-state-pp-to-literal): New optional parameter `not-in-delimiter'. Handle being inside comment opener. (c-invalidate-state-cache-1): Reckon with an extra "invalid" character in case we're typing a '*' after a '/'. (c-literal-limits): Handle the awkward "not-in-delimiter" cond arm instead by passing the parameter to c-state-pp-to-literal. * progmodes/cc-fonts.el (c-font-lock-doc-comments): New handling for elt. 7 of a parse state. --- lisp/ChangeLog | 16 +++++++++++ lisp/progmodes/cc-engine.el | 55 +++++++++++++++++++++---------------- lisp/progmodes/cc-fonts.el | 2 +- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 1ec3fe98251..d4e229eb6fa 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,19 @@ +2013-04-03 Alan Mackenzie + + Handle `parse-partial-sexp' landing inside a comment opener + (Bug#13244). Also adapt to the new values of element 7 of a parse + state. + + * progmodes/cc-engine.el (c-state-pp-to-literal): New optional + parameter `not-in-delimiter'. Handle being inside comment opener. + (c-invalidate-state-cache-1): Reckon with an extra "invalid" + character in case we're typing a '*' after a '/'. + (c-literal-limits): Handle the awkward "not-in-delimiter" cond arm + instead by passing the parameter to c-state-pp-to-literal. + + * progmodes/cc-fonts.el (c-font-lock-doc-comments): New handling + for elt. 7 of a parse state. + 2013-04-01 Paul Eggert Use UTF-8 for most files with non-ASCII characters (Bug#13936). diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 368b1fc50dc..4fc270792fc 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -2180,32 +2180,45 @@ comment at the start of cc-engine.el for more info." ;; reduced by buffer changes, and increased by invocations of ;; `c-state-literal-at'. FIXME!!! -(defsubst c-state-pp-to-literal (from to) +(defsubst c-state-pp-to-literal (from to &optional not-in-delimiter) ;; Do a parse-partial-sexp from FROM to TO, returning either ;; (STATE TYPE (BEG . END)) if TO is in a literal; or ;; (STATE) otherwise, ;; where STATE is the parsing state at TO, TYPE is the type of the literal ;; (one of 'c, 'c++, 'string) and (BEG . END) is the boundaries of the literal. ;; + ;; Unless NOT-IN-DELIMITER is non-nil, when TO is inside a two-character + ;; comment opener, this is recognized as being in a comment literal. + ;; ;; Only elements 3 (in a string), 4 (in a comment), 5 (following a quote), ;; 7 (comment type) and 8 (start of comment/string) (and possibly 9) of ;; STATE are valid. (save-excursion (let ((s (parse-partial-sexp from to)) - ty) - (when (or (nth 3 s) (nth 4 s)) ; in a string or comment + ty co-st) + (cond + ((or (nth 3 s) (nth 4 s)) ; in a string or comment (setq ty (cond ((nth 3 s) 'string) - ((eq (nth 7 s) t) 'c++) + ((nth 7 s) 'c++) (t 'c))) (parse-partial-sexp (point) (point-max) - nil ; TARGETDEPTH - nil ; STOPBEFORE - s ; OLDSTATE - 'syntax-table)) ; stop at end of literal - (if ty - `(,s ,ty (,(nth 8 s) . ,(point))) - `(,s))))) + nil ; TARGETDEPTH + nil ; STOPBEFORE + s ; OLDSTATE + 'syntax-table) ; stop at end of literal + `(,s ,ty (,(nth 8 s) . ,(point)))) + + ((and (not not-in-delimiter) ; inside a comment starter + (not (bobp)) + (progn (backward-char) + (looking-at c-comment-start-regexp))) + (setq ty (if (looking-at c-block-comment-start-regexp) 'c 'c++) + co-st (point)) + (forward-comment 1) + `(,s ,ty (,co-st . ,(point)))) + + (t `(,s)))))) (defun c-state-safe-place (here) ;; Return a buffer position before HERE which is "safe", i.e. outside any @@ -3143,10 +3156,13 @@ comment at the start of cc-engine.el for more info." ;; This function is called from c-after-change. ;; The caches of non-literals: - (if (< here c-state-nonlit-pos-cache-limit) - (setq c-state-nonlit-pos-cache-limit here)) - (if (< here c-state-semi-nonlit-pos-cache-limit) - (setq c-state-semi-nonlit-pos-cache-limit here)) + ;; Note that we use "<=" for the possibility of the second char of a two-char + ;; comment opener being typed; this would invalidate any cache position at + ;; HERE. + (if (<= here c-state-nonlit-pos-cache-limit) + (setq c-state-nonlit-pos-cache-limit (1- here))) + (if (<= here c-state-semi-nonlit-pos-cache-limit) + (setq c-state-semi-nonlit-pos-cache-limit (1- here))) ;; `c-state-cache': ;; Case 1: if `here' is in a literal containing point-min, everything @@ -4444,19 +4460,12 @@ comment at the start of cc-engine.el for more info." (lim (or lim (c-state-semi-safe-place pos))) (pp-to-lit (save-restriction (widen) - (c-state-pp-to-literal lim pos))) + (c-state-pp-to-literal lim pos not-in-delimiter))) (state (car pp-to-lit)) (lit-limits (car (cddr pp-to-lit)))) (cond (lit-limits) - ((and (not not-in-delimiter) - (not (elt state 5)) - (eq (char-before) ?/) - (looking-at "[/*]")) ; FIXME!!! use c-line/block-comment-starter. 2008-09-28. - ;; We're standing in a comment starter. - (backward-char 1) - (cons (point) (progn (c-forward-single-comment) (point)))) (near (goto-char pos) diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index f6c47f5bb4d..83343b23014 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -2486,7 +2486,7 @@ need for `pike-font-lock-extra-types'.") (setq comment-beg nil)) (setq region-beg comment-beg)) - (if (eq (elt (parse-partial-sexp comment-beg (+ comment-beg 2)) 7) t) + (if (elt (parse-partial-sexp comment-beg (+ comment-beg 2)) 7) ;; Collect a sequence of doc style line comments. (progn (goto-char comment-beg) -- 2.39.2