[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master aabb844: CC Mode. Create lang vars for certain skip
From: |
Alan Mackenzie |
Subject: |
[Emacs-diffs] master aabb844: CC Mode. Create lang vars for certain skipping expressions at compile time |
Date: |
Fri, 26 Jul 2019 13:50:59 -0400 (EDT) |
branch: master
commit aabb844e45642d6bf80673159dae18f4ea3693e4
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>
CC Mode. Create lang vars for certain skipping expressions at compile time
This saves repeated calculations at run time.
* lisp/progmodes/cc-langs.el (c-stmt-boundary-skip-chars)
(c-stmt-boundary-skip-list, c-stmt-boundary-skip-chars-with-comma)
(c-stmt-boundary-skip-list-with-comma): New lang constants/variables.
* lisp/progmodes/cc-engine.el (c-commas-bound-stmts): New variable
(c-beginning-of-statement-1): Set c-commas-bound-stmts rather than
c-stmt-delim-chars.
(c-crosses-statement-barrier-p): Remove the now unneeded calculations of
c-stmt-delim-chars. Set skip chars to one of the new lang variables, and
later to a substring of it.
(c-at-statement-start-p): Set c-syntactic-skip-backward from the new
variables.
(c-at-expression-start-p): Bind c-commas-bound-stmts. Use
c-stmt-delim-chars-with-comma rather than c-stmt-delim-chars in a backward
scan.
(c-guess-basic-syntax): Bind c-commas-bound-stmts rather than
c-stmt-delim-chars to itself. Bind c-commas-bound-stmts to t at another
place
rather than setting c-stmt-delim-chars to c-stmt-delim-chars-with-comma.
---
lisp/progmodes/cc-engine.el | 52 ++++++++++++++++++++++++---------------------
lisp/progmodes/cc-langs.el | 44 ++++++++++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 24 deletions(-)
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index a89528d..1ebacb5 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -713,6 +713,10 @@ comment at the start of cc-engine.el for more info."
;; the byte compiler.
(defvar c-maybe-labelp)
+(defvar c-commas-bound-stmts nil)
+ ;; Set to non-nil when `c-beginning-of-statement-1' is to regard a comma as
+ ;; a statement terminator.
+
;; New awk-compatible version of c-beginning-of-statement-1, ACM 2002/6/22
;; Macros used internally in c-beginning-of-statement-1 for the
@@ -897,9 +901,7 @@ comment at the start of cc-engine.el for more info."
(start (point))
macro-start
(delims (if comma-delim '(?\; ?,) '(?\;)))
- (c-stmt-delim-chars (if comma-delim
- c-stmt-delim-chars-with-comma
- c-stmt-delim-chars))
+ (c-commas-bound-stmts (or c-commas-bound-stmts comma-delim))
c-maybe-labelp after-case:-pos saved
;; Current position.
pos
@@ -1422,21 +1424,12 @@ the line. If this virtual semicolon is _at_ from, the
function recognizes it.
Note that this function might do hidden buffer changes. See the
comment at the start of cc-engine.el for more info."
- (let* ((skip-chars
- ;; If the current language has CPP macros, insert # into skip-chars.
- (if c-opt-cpp-symbol
- (concat (substring c-stmt-delim-chars 0 1) ; "^"
- c-opt-cpp-symbol ; usually "#"
- (substring c-stmt-delim-chars 1)) ; e.g. ";{}?:"
- c-stmt-delim-chars))
- (skip-chars
- (if (c-major-mode-is 'c++-mode)
- (concat (substring skip-chars 0 1) ; "^"
- "[" ; to catch C++ attributes
- (substring skip-chars 1)) ; e.g. "#;{}?:"
- skip-chars))
- (non-skip-list
- (append (substring skip-chars 1) nil)) ; e.g. (?# ?\; ?{ ?} ?? ?:)
+ (let* ((skip-chars (if c-commas-bound-stmts
+ c-stmt-boundary-skip-chars-with-comma
+ c-stmt-boundary-skip-chars)) ; e.g. "^#;{}?:"
+ (non-skip-list (if c-commas-bound-stmts
+ c-stmt-boundary-skip-list-with-comma
+ c-stmt-boundary-skip-list)) ; e.g. (?# ?\; ?{ ?} ??
?:)
lit-range lit-start vsemi-pos attr-end)
(save-restriction
(widen)
@@ -1477,7 +1470,11 @@ comment at the start of cc-engine.el for more info."
;; A question mark. Can't be a label, so stop
;; looking for more : and ?.
(setq c-maybe-labelp nil
- skip-chars (substring c-stmt-delim-chars 0 -2)))
+ skip-chars
+ (substring (if c-commas-bound-stmts
+ c-stmt-delim-chars-with-comma
+ c-stmt-delim-chars)
+ 0 -2)))
;; At a CPP construct or a "#" or "##" operator?
((and c-opt-cpp-symbol (looking-at c-opt-cpp-symbol))
(if (save-excursion
@@ -1513,7 +1510,13 @@ comment at the start of cc-engine.el for more info."
(save-excursion
(let ((end (point))
c-maybe-labelp)
- (c-syntactic-skip-backward (substring c-stmt-delim-chars 1) nil t)
+ (c-syntactic-skip-backward
+ (substring
+ (if c-commas-bound-stmts
+ c-stmt-delim-chars-with-comma
+ c-stmt-delim-chars)
+ 1)
+ nil t)
(or (bobp)
(eq (char-before) ?})
(and (eq (char-before) ?{)
@@ -1540,9 +1543,10 @@ comment at the start of cc-engine.el for more info."
(save-excursion
(let ((end (point))
- (c-stmt-delim-chars c-stmt-delim-chars-with-comma)
+ (c-commas-bound-stmts t)
c-maybe-labelp)
- (c-syntactic-skip-backward (substring c-stmt-delim-chars 1) nil t)
+ (c-syntactic-skip-backward (substring c-stmt-delim-chars-with-comma 1)
+ nil t)
(or (bobp)
(memq (char-before) '(?{ ?}))
(save-excursion (backward-char)
@@ -12587,7 +12591,7 @@ comment at the start of cc-engine.el for more info."
;; There's always at most one syntactic element which got
;; an anchor pos. It's stored in syntactic-relpos.
syntactic-relpos
- (c-stmt-delim-chars c-stmt-delim-chars))
+ (c-commas-bound-stmts c-commas-bound-stmts))
;; Check if we're directly inside an enclosing declaration
;; level block.
@@ -12639,7 +12643,7 @@ comment at the start of cc-engine.el for more info."
;; arglists.
(when (and containing-sexp
(eq (char-after containing-sexp) ?\())
- (setq c-stmt-delim-chars c-stmt-delim-chars-with-comma))
+ (setq c-commas-bound-stmts t))
;; cache char before and after indent point, and move point to
;; the most likely position to perform the majority of tests
(goto-char indent-point)
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index a0d4559..8a4f8f5 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -1442,12 +1442,56 @@ operators."
t "^;{}?:")
(c-lang-defvar c-stmt-delim-chars (c-lang-const c-stmt-delim-chars))
+(c-lang-defconst c-stmt-boundary-skip-chars
+ ;; Like `c-stmt-delim-chars', but augmented by "#" for languages with CPP
+ ;; constructs, and for C++ Mode, also by "[", to help deal with C++
+ ;; attributes.
+ t (if (c-lang-const c-opt-cpp-symbol)
+ (concat (substring (c-lang-const c-stmt-delim-chars) 0 1) ; "^"
+ (c-lang-const c-opt-cpp-symbol) ; usually #
+ (substring (c-lang-const c-stmt-delim-chars) 1)) ; ";{}?:"
+ (c-lang-const c-stmt-delim-chars))
+ c++ (concat (substring (c-lang-const c-stmt-boundary-skip-chars) 0 1) ; "^"
+ "["
+ (substring (c-lang-const c-stmt-boundary-skip-chars) 1))) ;
";{}?:"
+(c-lang-defvar c-stmt-boundary-skip-chars
+ (c-lang-const c-stmt-boundary-skip-chars))
+
+(c-lang-defconst c-stmt-boundary-skip-list
+ ;; The characters (apart from the initial ^) in `c-stmt-boundary-skip-chars'
+ ;; as a list of characters.
+ t (append (substring (c-lang-const c-stmt-boundary-skip-chars) 1) nil))
+(c-lang-defvar c-stmt-boundary-skip-list
+ (c-lang-const c-stmt-boundary-skip-list))
+
(c-lang-defconst c-stmt-delim-chars-with-comma
;; Variant of `c-stmt-delim-chars' that additionally contains ','.
t "^;,{}?:")
(c-lang-defvar c-stmt-delim-chars-with-comma
(c-lang-const c-stmt-delim-chars-with-comma))
+(c-lang-defconst c-stmt-boundary-skip-chars-with-comma
+ ;; Variant of `c-stmt-boundary-skip-chars' also containing ','.
+ t (if (c-lang-const c-opt-cpp-symbol)
+ (concat (substring (c-lang-const c-stmt-delim-chars-with-comma) 0 1)
+ (c-lang-const c-opt-cpp-symbol) ; usually #
+ (substring (c-lang-const c-stmt-delim-chars-with-comma) 1))
+ (c-lang-const c-stmt-delim-chars-with-comma))
+ c++ (concat
+ (substring (c-lang-const c-stmt-boundary-skip-chars-with-comma) 0 1) ;
"^"
+ "["
+ (substring (c-lang-const c-stmt-boundary-skip-chars-with-comma) 1))) ;
";,{}?:"
+(c-lang-defvar c-stmt-boundary-skip-chars-with-comma
+ (c-lang-const c-stmt-boundary-skip-chars-with-comma))
+
+(c-lang-defconst c-stmt-boundary-skip-list-with-comma
+ ;; Variant of `c-stmt-boundary-skip-list' also including a comma.
+ t (append (substring (c-lang-const c-stmt-boundary-skip-chars-with-comma)
+ 1)
+ nil))
+(c-lang-defvar c-stmt-boundary-skip-list-with-comma
+ (c-lang-const c-stmt-boundary-skip-list-with-comma))
+
(c-lang-defconst c-pack-ops
"Ops which signal C++11's \"parameter pack\""
t nil
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master aabb844: CC Mode. Create lang vars for certain skipping expressions at compile time,
Alan Mackenzie <=