diff options
| author | Richard M. Stallman | 1998-03-08 06:49:04 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1998-03-08 06:49:04 +0000 |
| commit | b2acd789585ac55b73175ef4f30d970638c6f06d (patch) | |
| tree | db97dcf9129108cb772f58b422f821541944eb00 | |
| parent | 419277c5b89ada601ed0de4e142df0fa18c9c107 (diff) | |
| download | emacs-b2acd789585ac55b73175ef4f30d970638c6f06d.tar.gz emacs-b2acd789585ac55b73175ef4f30d970638c6f06d.zip | |
(c-inside-bracelist-p): Fix for enum test.
(c-collect-line-comments): Require same comment start column.
(c-guess-basic-syntax): Fixes for nesting of and
repeated defun-open's inside extern and namespace clauses. This
is done by passing a relpos to `inextern-lang' and `innamespace'.
Also, the relpos in `defun-open' is no longer always bol. It's
always bol when on the top level, however. Changed cases: 5A.5, 5I, 14A.
(c-forward-token-1, c-backward-token-1): New functions to move by tokens.
c-guess-basic-syntax): Fixes for Java 1.1 array initialization brace lists.
| -rw-r--r-- | lisp/progmodes/cc-engine.el | 156 |
1 files changed, 108 insertions, 48 deletions
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index f4f37379a5b..31a26c3c3c3 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el | |||
| @@ -271,6 +271,53 @@ | |||
| 271 | (if lim (goto-char (max (point) lim))))) | 271 | (if lim (goto-char (max (point) lim))))) |
| 272 | 272 | ||
| 273 | 273 | ||
| 274 | ;; Moving by tokens, where a token is defined as all symbols and | ||
| 275 | ;; identifiers which aren't syntactic whitespace. COUNT specifies the | ||
| 276 | ;; number of tokens to move forward; a negative COUNT moves backward. | ||
| 277 | ;; If BALANCED is true, move over balanced parens, otherwise move into | ||
| 278 | ;; them. Also, if BALANCED is true, never move out of an enclosing | ||
| 279 | ;; paren. LIM sets the limit for the movement. Point is always left | ||
| 280 | ;; at the beginning of a token or at LIM. Returns the number of | ||
| 281 | ;; tokens left to move (positive or negative). If BALANCED is true, a | ||
| 282 | ;; move over a balanced paren counts as one. | ||
| 283 | |||
| 284 | (defun c-forward-token-1 (&optional count balanced lim) | ||
| 285 | (let* ((jump-syntax (if balanced | ||
| 286 | '(?w ?_ ?\" ?\\ ?/ ?$ ?' ?\( ?\)) | ||
| 287 | '(?w ?_ ?\" ?\\ ?/ ?$ ?')))) | ||
| 288 | (or count (setq count 1)) | ||
| 289 | (condition-case nil | ||
| 290 | (while (progn | ||
| 291 | (c-forward-syntactic-ws lim) | ||
| 292 | (> count 0)) | ||
| 293 | (if (memq (char-syntax (char-after)) jump-syntax) | ||
| 294 | (goto-char (scan-sexps (point) 1)) | ||
| 295 | (forward-char)) | ||
| 296 | (setq count (1- count))) | ||
| 297 | (error | ||
| 298 | (and lim (> (point) lim) (goto-char lim)))) | ||
| 299 | count)) | ||
| 300 | |||
| 301 | (defun c-backward-token-1 (&optional count balanced lim) | ||
| 302 | (let* ((jump-syntax (if balanced | ||
| 303 | '(?w ?_ ?\" ?\\ ?/ ?$ ?' ?\( ?\)) | ||
| 304 | '(?w ?_ ?\" ?\\ ?/ ?$ ?'))) | ||
| 305 | last) | ||
| 306 | (or count (setq count 1)) | ||
| 307 | (condition-case nil | ||
| 308 | (while (> count 0) | ||
| 309 | (setq last (point)) | ||
| 310 | (c-backward-syntactic-ws lim) | ||
| 311 | (if (memq (char-syntax (char-before)) jump-syntax) | ||
| 312 | (goto-char (scan-sexps (point) -1)) | ||
| 313 | (backward-char)) | ||
| 314 | (setq count (1- count))) | ||
| 315 | (error | ||
| 316 | (goto-char last) | ||
| 317 | (and lim (< (point) lim) (goto-char lim)))) | ||
| 318 | count)) | ||
| 319 | |||
| 320 | |||
| 274 | ;; Return `c' if in a C-style comment, `c++' if in a C++ style | 321 | ;; Return `c' if in a C-style comment, `c++' if in a C++ style |
| 275 | ;; comment, `string' if in a string literal, `pound' if on a | 322 | ;; comment, `string' if in a string literal, `pound' if on a |
| 276 | ;; preprocessor line, or nil if not in a comment at all. Optional LIM | 323 | ;; preprocessor line, or nil if not in a comment at all. Optional LIM |
| @@ -376,24 +423,30 @@ | |||
| 376 | ;; If the argument is a cons of two buffer positions (such as | 423 | ;; If the argument is a cons of two buffer positions (such as |
| 377 | ;; returned by c-literal-limits), and that range contains a C++ | 424 | ;; returned by c-literal-limits), and that range contains a C++ |
| 378 | ;; style line comment, then an extended range is returned that | 425 | ;; style line comment, then an extended range is returned that |
| 379 | ;; contains all adjacent line comments (i.e. all comments with no | 426 | ;; contains all adjacent line comments (i.e. all comments that |
| 380 | ;; empty lines or non-whitespace characters between them). | 427 | ;; starts in the same column with no empty lines or non-whitespace |
| 381 | ;; Otherwise the argument is returned. | 428 | ;; characters between them). Otherwise the argument is returned. |
| 382 | (save-excursion | 429 | (save-excursion |
| 383 | (condition-case nil | 430 | (condition-case nil |
| 384 | (if (and (consp range) (progn | 431 | (if (and (consp range) (progn |
| 385 | (goto-char (car range)) | 432 | (goto-char (car range)) |
| 386 | (looking-at "//"))) | 433 | (looking-at "//"))) |
| 387 | (let ((beg (point))) | 434 | (let ((col (current-column)) |
| 435 | (beg (point)) | ||
| 436 | (end (cdr range))) | ||
| 388 | (while (and (not (bobp)) | 437 | (while (and (not (bobp)) |
| 389 | (forward-comment -1) | 438 | (forward-comment -1) |
| 390 | (looking-at "//")) | 439 | (looking-at "//") |
| 440 | (= col (current-column))) | ||
| 391 | (setq beg (point))) | 441 | (setq beg (point))) |
| 392 | (cons beg (progn | 442 | (goto-char end) |
| 393 | (goto-char (cdr range)) | 443 | (while (progn |
| 394 | (while (looking-at "[ \t]*//") | 444 | (skip-chars-forward " \t") |
| 395 | (forward-comment 1)) | 445 | (and (looking-at "//") |
| 396 | (point)))) | 446 | (= col (current-column)))) |
| 447 | (forward-comment 1) | ||
| 448 | (setq end (point))) | ||
| 449 | (cons beg end)) | ||
| 397 | range) | 450 | range) |
| 398 | (error range)))) | 451 | (error range)))) |
| 399 | 452 | ||
| @@ -850,35 +903,32 @@ | |||
| 850 | ;; speed. | 903 | ;; speed. |
| 851 | (or | 904 | (or |
| 852 | ;; this will pick up enum lists | 905 | ;; this will pick up enum lists |
| 853 | (condition-case () | 906 | (c-safe |
| 854 | (save-excursion | 907 | (save-excursion |
| 855 | (goto-char containing-sexp) | 908 | (goto-char containing-sexp) |
| 856 | (forward-sexp -1) | 909 | (forward-sexp -1) |
| 857 | (if (and (or (looking-at "enum[\t\n ]+") | 910 | (let (bracepos) |
| 858 | (progn (forward-sexp -1) | 911 | (if (and (or (looking-at "enum[\t\n ]+") |
| 859 | (looking-at "enum[\t\n ]+"))) | 912 | (progn (forward-sexp -1) |
| 860 | (progn (c-end-of-statement-1) | 913 | (looking-at "enum[\t\n ]+"))) |
| 861 | (> (point) containing-sexp))) | 914 | (setq bracepos (c-safe (scan-lists (point) 1 -1))) |
| 862 | (point))) | 915 | (not (c-crosses-statement-barrier-p (point) |
| 863 | (error nil)) | 916 | (- bracepos 2)))) |
| 917 | (point))))) | ||
| 864 | ;; this will pick up array/aggregate init lists, even if they are nested. | 918 | ;; this will pick up array/aggregate init lists, even if they are nested. |
| 865 | (save-excursion | 919 | (save-excursion |
| 866 | (let (bufpos failedp) | 920 | (let (bufpos okp) |
| 867 | (while (and (not bufpos) | 921 | (while (and (not bufpos) |
| 868 | containing-sexp) | 922 | containing-sexp) |
| 869 | (if (consp containing-sexp) | 923 | (if (consp containing-sexp) |
| 870 | (setq containing-sexp (car brace-state) | 924 | (setq containing-sexp (car brace-state) |
| 871 | brace-state (cdr brace-state)) | 925 | brace-state (cdr brace-state)) |
| 872 | ;; see if significant character just before brace is an equal | 926 | ;; see if the open brace is preceded by a = in this statement |
| 873 | (goto-char containing-sexp) | 927 | (goto-char containing-sexp) |
| 874 | (setq failedp nil) | 928 | (setq okp t) |
| 875 | (condition-case () | 929 | (while (and (setq okp (= (c-backward-token-1 1 t) 0)) |
| 876 | (progn | 930 | (not (memq (char-after) '(?= ?{ ?\;))))) |
| 877 | (forward-sexp -1) | 931 | (if (not (and okp (eq (char-after) ?=))) |
| 878 | (forward-sexp 1) | ||
| 879 | (c-forward-syntactic-ws containing-sexp)) | ||
| 880 | (error (setq failedp t))) | ||
| 881 | (if (or failedp (not (eq (char-after) ?=))) | ||
| 882 | ;; lets see if we're nested. find the most nested | 932 | ;; lets see if we're nested. find the most nested |
| 883 | ;; containing brace | 933 | ;; containing brace |
| 884 | (setq containing-sexp (car brace-state) | 934 | (setq containing-sexp (car brace-state) |
| @@ -1109,7 +1159,12 @@ | |||
| 1109 | (c-forward-syntactic-ws indent-point))) | 1159 | (c-forward-syntactic-ws indent-point))) |
| 1110 | (setq placeholder (c-point 'boi)) | 1160 | (setq placeholder (c-point 'boi)) |
| 1111 | (and (or (looking-at "enum[ \t\n]+") | 1161 | (and (or (looking-at "enum[ \t\n]+") |
| 1112 | (eq char-before-ip ?=)) | 1162 | (save-excursion |
| 1163 | (goto-char indent-point) | ||
| 1164 | (while (and (> (point) placeholder) | ||
| 1165 | (= (c-backward-token-1 1 t) 0) | ||
| 1166 | (/= (char-after) ?=))) | ||
| 1167 | (eq (char-after) ?=))) | ||
| 1113 | (save-excursion | 1168 | (save-excursion |
| 1114 | (skip-chars-forward "^;(" indent-point) | 1169 | (skip-chars-forward "^;(" indent-point) |
| 1115 | (not (memq (char-after) '(?\; ?\())) | 1170 | (not (memq (char-after) '(?\; ?\())) |
| @@ -1122,7 +1177,9 @@ | |||
| 1122 | ;; CASE 5A.5: ordinary defun open | 1177 | ;; CASE 5A.5: ordinary defun open |
| 1123 | (t | 1178 | (t |
| 1124 | (goto-char placeholder) | 1179 | (goto-char placeholder) |
| 1125 | (c-add-syntax 'defun-open (c-point 'bol)) | 1180 | (if inclass-p |
| 1181 | (c-add-syntax 'defun-open (c-point 'boi)) | ||
| 1182 | (c-add-syntax 'defun-open (c-point 'bol))) | ||
| 1126 | ))) | 1183 | ))) |
| 1127 | ;; CASE 5B: first K&R arg decl or member init | 1184 | ;; CASE 5B: first K&R arg decl or member init |
| 1128 | ((c-just-after-func-arglist-p) | 1185 | ((c-just-after-func-arglist-p) |
| @@ -1302,7 +1359,7 @@ | |||
| 1302 | (looking-at c-access-key)) | 1359 | (looking-at c-access-key)) |
| 1303 | (c-add-syntax 'access-label (c-point 'bonl)) | 1360 | (c-add-syntax 'access-label (c-point 'bonl)) |
| 1304 | (c-add-syntax 'inclass (aref inclass-p 0))) | 1361 | (c-add-syntax 'inclass (aref inclass-p 0))) |
| 1305 | ;; CASE 5F: extern-lang-close? | 1362 | ;; CASE 5F: extern-lang-close or namespace-close? |
| 1306 | ((and inenclosing-p | 1363 | ((and inenclosing-p |
| 1307 | (eq char-after-ip ?})) | 1364 | (eq char-after-ip ?})) |
| 1308 | (setq tmpsymbol (if (eq inenclosing-p 'extern) | 1365 | (setq tmpsymbol (if (eq inenclosing-p 'extern) |
| @@ -1389,9 +1446,9 @@ | |||
| 1389 | (goto-char (aref inclass-p 0))) | 1446 | (goto-char (aref inclass-p 0))) |
| 1390 | (cond | 1447 | (cond |
| 1391 | ((eq inenclosing-p 'extern) | 1448 | ((eq inenclosing-p 'extern) |
| 1392 | (c-add-syntax 'inextern-lang)) | 1449 | (c-add-syntax 'inextern-lang (c-point 'boi))) |
| 1393 | ((eq inenclosing-p 'namespace) | 1450 | ((eq inenclosing-p 'namespace) |
| 1394 | (c-add-syntax 'innamespace)) | 1451 | (c-add-syntax 'innamespace (c-point 'boi))) |
| 1395 | (t (c-add-syntax 'inclass (c-point 'boi)))) | 1452 | (t (c-add-syntax 'inclass (c-point 'boi)))) |
| 1396 | )) | 1453 | )) |
| 1397 | )) | 1454 | )) |
| @@ -1566,7 +1623,12 @@ | |||
| 1566 | ((or (save-excursion | 1623 | ((or (save-excursion |
| 1567 | (goto-char placeholder) | 1624 | (goto-char placeholder) |
| 1568 | (looking-at "\\<enum\\>")) | 1625 | (looking-at "\\<enum\\>")) |
| 1569 | (eq char-before-ip ?=)) | 1626 | (save-excursion |
| 1627 | (goto-char indent-point) | ||
| 1628 | (while (and (> (point) placeholder) | ||
| 1629 | (= (c-backward-token-1 1 t) 0) | ||
| 1630 | (/= (char-after) ?=))) | ||
| 1631 | (eq (char-after) ?=))) | ||
| 1570 | (c-add-syntax 'brace-list-open placeholder)) | 1632 | (c-add-syntax 'brace-list-open placeholder)) |
| 1571 | ;; CASE 9B.3: catch-all for unknown construct. | 1633 | ;; CASE 9B.3: catch-all for unknown construct. |
| 1572 | (t | 1634 | (t |
| @@ -1642,17 +1704,15 @@ | |||
| 1642 | (c-beginning-of-statement-1 lim)) | 1704 | (c-beginning-of-statement-1 lim)) |
| 1643 | (c-point 'boi)))) | 1705 | (c-point 'boi)))) |
| 1644 | (cond | 1706 | (cond |
| 1645 | ;; CASE 14A: does this close an inline? | 1707 | ;; CASE 14A: does this close an inline or a function in |
| 1646 | ((let ((inclass-p (progn | 1708 | ;; an extern block or namespace? |
| 1647 | (goto-char containing-sexp) | 1709 | ((progn |
| 1648 | (c-search-uplist-for-classkey state)))) | 1710 | (goto-char containing-sexp) |
| 1649 | ;; inenclosing-p in higher level let* | 1711 | (setq placeholder (c-search-uplist-for-classkey state))) |
| 1650 | (setq inenclosing-p (and inclass-p | 1712 | (goto-char (aref placeholder 0)) |
| 1651 | (progn | 1713 | (if (looking-at c-extra-toplevel-key) |
| 1652 | (goto-char (aref inclass-p 0)) | 1714 | (c-add-syntax 'defun-close relpos) |
| 1653 | (looking-at c-extra-toplevel-key)))) | 1715 | (c-add-syntax 'inline-close relpos))) |
| 1654 | (and inclass-p (not inenclosing-p))) | ||
| 1655 | (c-add-syntax 'inline-close relpos)) | ||
| 1656 | ;; CASE 14B: if there an enclosing brace that hasn't | 1716 | ;; CASE 14B: if there an enclosing brace that hasn't |
| 1657 | ;; been narrowed out by a class, then this is a | 1717 | ;; been narrowed out by a class, then this is a |
| 1658 | ;; block-close | 1718 | ;; block-close |