From 7a20ebe5ca884954e34c5129f70c211fef266369 Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Thu, 23 Jun 2016 16:12:45 +0000 Subject: [PATCH] Make typing into incomplete C++ raw strings work, and make it work fast enough * lisp/progmodes/cc-engine.el (c-beginning-of-macro, c-state-pp-to-literal): Put `save-match-data' around calls to `looking-at' to enable the use of the match data in higher level functions. * lisp/progmodes/cc-fonts.el (c-font-lock-declarations) (c-font-lock-cut-off-declarators): Use `limit' rather than `(point-max)' as a limit to speed up handling of C++ raw strings. --- lisp/progmodes/cc-engine.el | 55 +++++++++++++++++++++++---------------------- lisp/progmodes/cc-fonts.el | 4 ++-- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 595d57756eb..5fa04034585 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -305,7 +305,7 @@ comment at the start of cc-engine.el for more info." (forward-line -1)) (back-to-indentation) (if (and (<= (point) here) - (looking-at c-opt-cpp-start) + (save-match-data (looking-at c-opt-cpp-start)) (c-macro-is-genuine-p)) (progn (setq c-macro-cache (cons (point) nil) @@ -2304,32 +2304,33 @@ comment at the start of cc-engine.el for more info." ;; 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 co-st) - (cond - ((or (nth 3 s) (nth 4 s)) ; in a string or comment - (setq ty (cond - ((nth 3 s) 'string) - ((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 - `(,s ,ty (,(nth 8 s) . ,(point)))) - - ((and (not not-in-delimiter) ; inside a comment starter - (not (bobp)) - (progn (backward-char) - (and (not (looking-at "\\s!")) - (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)))))) + (save-match-data + (let ((s (parse-partial-sexp from to)) + ty co-st) + (cond + ((or (nth 3 s) (nth 4 s)) ; in a string or comment + (setq ty (cond + ((nth 3 s) 'string) + ((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 + `(,s ,ty (,(nth 8 s) . ,(point)))) + + ((and (not not-in-delimiter) ; inside a comment starter + (not (bobp)) + (progn (backward-char) + (and (not (looking-at "\\s!")) + (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 diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el index 65ec5c3f044..3a8c9ec0ec4 100644 --- a/lisp/progmodes/cc-fonts.el +++ b/lisp/progmodes/cc-fonts.el @@ -1396,7 +1396,7 @@ casts and declarations are fontified. Used on level 2 and higher." 'c-decl-id-start))))) (c-font-lock-declarators - (point-max) decl-list (cadr decl-or-cast))) + (min limit (point-max)) decl-list (cadr decl-or-cast))) ;; A declaration has been successfully identified, so do all the ;; fontification of types and refs that've been recorded. @@ -1542,7 +1542,7 @@ casts and declarations are fontified. Used on level 2 and higher." (c-forward-syntactic-ws)) ;; At a real declaration? (if (memq (c-forward-type t) '(t known found decltype)) - (c-font-lock-declarators (point-max) t is-typedef))) + (c-font-lock-declarators limit t is-typedef))) nil))))) (defun c-font-lock-enclosing-decls (limit) -- 2.11.4.GIT