Mercurial > emacs
annotate lisp/progmodes/cc-menus.el @ 48478:a94c995f94de
*** empty log message ***
| author | Stefan Monnier <monnier@iro.umontreal.ca> |
|---|---|
| date | Wed, 20 Nov 2002 18:54:25 +0000 |
| parents | 7a3ac6c387fe |
| children | 06a337e05b08 |
| rev | line source |
|---|---|
| 18720 | 1 ;;; cc-menus.el --- imenu support for CC Mode |
| 2 | |
| 36920 | 3 ;; Copyright (C) 1985,1987,1992-2001 Free Software Foundation, Inc. |
| 18720 | 4 |
| 30405 | 5 ;; Authors: 2000- Martin Stjernholm |
| 6 ;; 1998-1999 Barry A. Warsaw and Martin Stjernholm | |
| 24282 | 7 ;; 1992-1997 Barry A. Warsaw |
| 18720 | 8 ;; 1987 Dave Detlefs and Stewart Clamen |
| 9 ;; 1985 Richard M. Stallman | |
| 24282 | 10 ;; Maintainer: bug-cc-mode@gnu.org |
| 18720 | 11 ;; Created: 22-Apr-1997 (split from cc-mode.el) |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
12 ;; Version: See cc-mode.el |
| 18720 | 13 ;; Keywords: c languages oop |
| 14 | |
| 15 ;; This file is part of GNU Emacs. | |
| 16 | |
| 17 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
| 18 ;; it under the terms of the GNU General Public License as published by | |
| 19 ;; the Free Software Foundation; either version 2, or (at your option) | |
| 20 ;; any later version. | |
| 21 | |
| 22 ;; GNU Emacs is distributed in the hope that it will be useful, | |
| 23 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 24 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 25 ;; GNU General Public License for more details. | |
| 26 | |
| 27 ;; You should have received a copy of the GNU General Public License | |
|
44728
7a3ac6c387fe
CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents:
38422
diff
changeset
|
28 ;; along with GNU Emacs; see the file COPYING. If not, write to |
| 36920 | 29 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| 18720 | 30 ;; Boston, MA 02111-1307, USA. |
| 31 | |
|
38422
7a94f1c588c4
Some fixes to follow coding conventions.
Pavel Jan?k <Pavel@Janik.cz>
parents:
36920
diff
changeset
|
32 ;;; Commentary: |
|
7a94f1c588c4
Some fixes to follow coding conventions.
Pavel Jan?k <Pavel@Janik.cz>
parents:
36920
diff
changeset
|
33 |
|
7a94f1c588c4
Some fixes to follow coding conventions.
Pavel Jan?k <Pavel@Janik.cz>
parents:
36920
diff
changeset
|
34 ;;; Code: |
|
7a94f1c588c4
Some fixes to follow coding conventions.
Pavel Jan?k <Pavel@Janik.cz>
parents:
36920
diff
changeset
|
35 |
| 24282 | 36 (eval-when-compile |
| 26817 | 37 (let ((load-path |
| 36920 | 38 (if (and (boundp 'byte-compile-dest-file) |
| 39 (stringp byte-compile-dest-file)) | |
| 40 (cons (file-name-directory byte-compile-dest-file) load-path) | |
| 26817 | 41 load-path))) |
| 36920 | 42 (require 'cc-bytecomp))) |
| 26817 | 43 |
| 36920 | 44 ;; Try to pull in imenu if it exists. |
| 45 (condition-case nil | |
| 46 (require 'imenu) | |
| 47 (error nil)) | |
| 26817 | 48 |
| 36920 | 49 ;; The things referenced in imenu, which we don't require. |
| 50 (cc-bytecomp-defvar imenu-case-fold-search) | |
| 51 (cc-bytecomp-defvar imenu-generic-expression) | |
| 52 (cc-bytecomp-defun imenu-progress-message) | |
| 24282 | 53 |
| 18720 | 54 |
| 55 ;; imenu integration | |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
56 (defvar cc-imenu-c-prototype-macro-regexp nil |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
57 "RE matching macro names used to conditionally specify function prototypes. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
58 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
59 For example: |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
60 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
61 #ifdef __STDC__ |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
62 #define _P(x) x |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
63 #else |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
64 #define _P(x) /*nothing*/ |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
65 #endif |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
66 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
67 int main _P( (int argc, char *argv[]) ) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
68 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
69 A sample value might look like: `\\(_P\\|_PROTO\\)'.") |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
70 |
| 18720 | 71 (defvar cc-imenu-c++-generic-expression |
| 26817 | 72 `( |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
73 ;; Try to match ::operator definitions first. Otherwise `X::operator new ()' |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
74 ;; will be incorrectly recognised as function `new ()' because the regexps |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
75 ;; work by backtracking from the end of the definition. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
76 (nil |
| 26817 | 77 ,(concat |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
78 "^\\<.*" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
79 "[^a-zA-Z0-9_:<>~]" ; match any non-identifier char |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
80 ; (note: this can be `\n') |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
81 "\\(" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
82 "\\([a-zA-Z0-9_:<>~]*::\\)?" ; match an operator |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
83 "operator\\>[ \t]*" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
84 "\\(()\\|[^(]*\\)" ; special case for `()' operator |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
85 "\\)" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
86 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
87 "[ \t]*([^)]*)[ \t]*[^ \t;]" ; followed by ws, arg list, |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
88 ; require something other than |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
89 ; a `;' after the (...) to |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
90 ; avoid prototypes. Can't |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
91 ; catch cases with () inside |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
92 ; the parentheses surrounding |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
93 ; the parameters. e.g.: |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
94 ; `int foo(int a=bar()) {...}' |
| 26817 | 95 ) 1) |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
96 ;; Special case to match a line like `main() {}' |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
97 ;; e.g. no return type, not even on the previous line. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
98 (nil |
| 26817 | 99 ,(concat |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
100 "^" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
101 "\\([a-zA-Z_][a-zA-Z0-9_:<>~]*\\)" ; match function name |
| 20916 | 102 "[ \t]*(" ; see above, BUT |
| 103 "[ \t]*\\([^ \t(*][^)]*\\)?)" ; the arg list must not start | |
| 104 "[ \t]*[^ \t;(]" ; with an asterisk or parentheses | |
| 26817 | 105 ) 1) |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
106 ;; General function name regexp |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
107 (nil |
| 26817 | 108 ,(concat |
| 109 "^\\<" ; line MUST start with word char | |
| 110 "[^()]*" ; no parentheses before | |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
111 "[^a-zA-Z0-9_:<>~]" ; match any non-identifier char |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
112 "\\([a-zA-Z_][a-zA-Z0-9_:<>~]*\\)" ; match function name |
|
44728
7a3ac6c387fe
CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents:
38422
diff
changeset
|
113 "\\([ \t\n]\\|\\\\\n\\)*(" ; see above, BUT the arg list |
|
7a3ac6c387fe
CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents:
38422
diff
changeset
|
114 "\\([ \t\n]\\|\\\\\n\\)*\\([^ \t\n(*][^)]*\\)?)" ; must not start |
|
7a3ac6c387fe
CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents:
38422
diff
changeset
|
115 "\\([ \t\n]\\|\\\\\n\\)*[^ \t\n;(]" ; with an asterisk or parentheses |
| 26817 | 116 ) 1) |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
117 ;; Special case for definitions using phony prototype macros like: |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
118 ;; `int main _PROTO( (int argc,char *argv[]) )'. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
119 ;; This case is only included if cc-imenu-c-prototype-macro-regexp is set. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
120 ;; Only supported in c-code, so no `:<>~' chars in function name! |
| 26817 | 121 ,@(if cc-imenu-c-prototype-macro-regexp |
| 122 `((nil | |
| 123 ,(concat | |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
124 "^\\<.*" ; line MUST start with word char |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
125 "[^a-zA-Z0-9_]" ; match any non-identifier char |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
126 "\\([a-zA-Z_][a-zA-Z0-9_]*\\)" ; match function name |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
127 "[ \t]*" ; whitespace before macro name |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
128 cc-imenu-c-prototype-macro-regexp |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
129 "[ \t]*(" ; ws followed by first paren. |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
130 "[ \t]*([^)]*)[ \t]*)[ \t]*[^ \t;]" ; see above |
| 26817 | 131 ) 1))) |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
132 ;; Class definitions |
| 18720 | 133 ("Class" |
| 26817 | 134 ,(concat |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
135 "^" ; beginning of line is required |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
136 "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a `template <...>' |
| 36920 | 137 "\\(class\\|struct\\)[ \t]+" |
| 24282 | 138 "\\(" ; the string we want to get |
| 139 "[a-zA-Z0-9_]+" ; class name | |
| 36920 | 140 "\\(<[^>]+>\\)?" ; possibly explicitly specialized |
| 24282 | 141 "\\)" |
|
44728
7a3ac6c387fe
CC Mode update to version 5.29. This is for testing; it's not a released
Martin Stjernholm <mast@lysator.liu.se>
parents:
38422
diff
changeset
|
142 "\\([ \t\n]\\|\\\\\n\\)*[:{]" |
| 36920 | 143 ) 3)) |
| 18720 | 144 "Imenu generic expression for C++ mode. See `imenu-generic-expression'.") |
| 145 | |
| 146 (defvar cc-imenu-c-generic-expression | |
| 147 cc-imenu-c++-generic-expression | |
| 148 "Imenu generic expression for C mode. See `imenu-generic-expression'.") | |
| 149 | |
| 150 (defvar cc-imenu-java-generic-expression | |
| 26817 | 151 `((nil |
| 152 ,(concat | |
| 18720 | 153 "^\\([ \t]\\)*" |
| 26817 | 154 "\\([.A-Za-z0-9_-]+[ \t]+\\)?" ; type specs; there can be |
| 155 "\\([.A-Za-z0-9_-]+[ \t]+\\)?" ; more than 3 tokens, right? | |
| 156 "\\([.A-Za-z0-9_-]+[ \t]*[[]?[]]?\\)" | |
| 18720 | 157 "\\([ \t]\\)" |
| 158 "\\([A-Za-z0-9_-]+\\)" ; the string we want to get | |
| 24282 | 159 "\\([ \t]*\\)+(" |
| 26817 | 160 "[][a-zA-Z,_1-9\n \t]*" ; arguments |
| 18720 | 161 ")[ \t]*" |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
162 ; "[^;(]" |
| 18720 | 163 "[,a-zA-Z_1-9\n \t]*{" |
| 26817 | 164 ) 6)) |
| 18720 | 165 "Imenu generic expression for Java mode. See `imenu-generic-expression'.") |
| 166 | |
| 20916 | 167 ;; *Warning for cc-mode developers* |
| 168 ;; | |
| 169 ;; `cc-imenu-objc-generic-expression' elements depend on | |
| 170 ;; `cc-imenu-c++-generic-expression'. So if you change this | |
| 171 ;; expression, you need to change following variables, | |
| 172 ;; `cc-imenu-objc-generic-expression-*-index', | |
| 173 ;; too. `cc-imenu-objc-function' uses these *-index variables, in | |
| 174 ;; order to know where the each regexp *group \\(foobar\\)* elements | |
| 175 ;; are started. | |
| 176 ;; | |
| 177 ;; *-index variables are initialized during `cc-imenu-objc-generic-expression' | |
| 178 ;; being initialized. | |
| 179 ;; | |
| 180 | |
| 181 ;; Internal variables | |
| 182 (defvar cc-imenu-objc-generic-expression-noreturn-index nil) | |
| 183 (defvar cc-imenu-objc-generic-expression-general-func-index nil) | |
| 184 (defvar cc-imenu-objc-generic-expression-proto-index nil) | |
| 185 (defvar cc-imenu-objc-generic-expression-objc-base-index nil) | |
| 186 | |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
187 (defvar cc-imenu-objc-generic-expression |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
188 (concat |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
189 ;; |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
190 ;; For C |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
191 ;; |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
192 ;; > Special case to match a line like `main() {}' |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
193 ;; > e.g. no return type, not even on the previous line. |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
194 ;; Pick a token by (match-string 1) |
| 20916 | 195 (car (cdr (nth 1 cc-imenu-c++-generic-expression))) ; -> index += 2 |
| 196 (prog2 (setq cc-imenu-objc-generic-expression-noreturn-index 1) "") | |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
197 "\\|" |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
198 ;; > General function name regexp |
| 20916 | 199 ;; Pick a token by (match-string 3) |
| 200 (car (cdr (nth 2 cc-imenu-c++-generic-expression))) ; -> index += 2 | |
| 201 (prog2 (setq cc-imenu-objc-generic-expression-general-func-index 3) "") | |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
202 ;; > Special case for definitions using phony prototype macros like: |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
203 ;; > `int main _PROTO( (int argc,char *argv[]) )'. |
| 20916 | 204 ;; Pick a token by (match-string 5) |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
205 (if cc-imenu-c-prototype-macro-regexp |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
206 (concat |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
207 "\\|" |
| 20916 | 208 (car (cdr (nth 3 cc-imenu-c++-generic-expression))) ; -> index += 1 |
| 209 (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 6) "") | |
| 210 ) | |
| 211 (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 5) "") | |
| 212 "") ; -> index += 0 | |
| 213 (prog2 (setq cc-imenu-objc-generic-expression-proto-index 5) "") | |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
214 ;; |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
215 ;; For Objective-C |
| 20916 | 216 ;; Pick a token by (match-string 5 or 6) |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
217 ;; |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
218 "\\|\\(" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
219 "^[-+][:a-zA-Z0-9()*_<>\n\t ]*[;{]" ; Methods |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
220 "\\|" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
221 "^@interface[\t ]+[a-zA-Z0-9_]+[\t ]*:" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
222 "\\|" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
223 "^@interface[\t ]+[a-zA-Z0-9_]+[\t ]*([a-zA-Z0-9_]+)" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
224 "\\|" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
225 ;; For NSObject, NSProxy and Object... They don't have super class. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
226 "^@interface[\t ]+[a-zA-Z0-9_]+[\t ]*.*$" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
227 "\\|" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
228 "^@implementation[\t ]+[a-zA-Z0-9_]+[\t ]*([a-zA-Z0-9_]+)" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
229 "\\|" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
230 "^@implementation[\t ]+[a-zA-Z0-9_]+" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
231 "\\|" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
232 "^@protocol[\t ]+[a-zA-Z0-9_]+" "\\)") |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
233 "Imenu generic expression for ObjC mode. See `imenu-generic-expression'.") |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
234 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
235 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
236 ;; Imenu support for objective-c uses functions. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
237 (defsubst cc-imenu-objc-method-to-selector (method) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
238 "Return the objc selector style string of METHOD. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
239 Example: |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
240 - perform: (SEL)aSelector withObject: object1 withObject: object2; /* METHOD */ |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
241 => |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
242 -perform:withObject:withObject:withObject: /* selector */" |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
243 (let ((return "") ; String to be returned |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
244 (p 0) ; Current scanning position in METHOD |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
245 (pmax (length method)) ; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
246 char ; Current scanning target |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
247 (betweenparen 0) ; CHAR is in parentheses. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
248 argreq ; An argument is required. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
249 inargvar) ; position of CHAR is in an argument variable. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
250 (while (< p pmax) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
251 (setq char (aref method p) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
252 p (1+ p)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
253 (cond |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
254 ;; Is CHAR part of a objc token? |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
255 ((and (not inargvar) ; Ignore if CHAR is part of an argument variable. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
256 (eq 0 betweenparen) ; Ignore if CHAR is in parentheses. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
257 (or (and (<= ?a char) (<= char ?z)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
258 (and (<= ?A char) (<= char ?Z)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
259 (and (<= ?0 char) (<= char ?9)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
260 (= ?_ char))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
261 (if argreq |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
262 (setq inargvar t |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
263 argreq nil) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
264 (setq return (concat return (char-to-string char))))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
265 ;; Or a white space? |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
266 ((and inargvar (or (eq ?\ char) (eq ?\n char)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
267 (setq inargvar nil))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
268 ;; Or a method separator? |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
269 ;; If a method separator, the next token will be an argument variable. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
270 ((eq ?: char) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
271 (setq argreq t |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
272 return (concat return (char-to-string char)))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
273 ;; Or an open parentheses? |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
274 ((eq ?\( char) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
275 (setq betweenparen (1+ betweenparen))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
276 ;; Or a close parentheses? |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
277 ((eq ?\) char) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
278 (setq betweenparen (1- betweenparen))))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
279 return)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
280 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
281 (defun cc-imenu-objc-remove-white-space (str) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
282 "Remove all spaces and tabs from STR." |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
283 (let ((return "") |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
284 (p 0) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
285 (max (length str)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
286 char) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
287 (while (< p max) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
288 (setq char (aref str p)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
289 (setq p (1+ p)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
290 (if (or (= char ?\ ) (= char ?\t)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
291 () |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
292 (setq return (concat return (char-to-string char))))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
293 return)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
294 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
295 (defun cc-imenu-objc-function () |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
296 "imenu supports for objc-mode." |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
297 (let (methodlist |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
298 clist |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
299 ;; |
| 20916 | 300 ;; OBJC, Cnoreturn, Cgeneralfunc, Cproto are constants. |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
301 ;; |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
302 ;; *Warning for developers* |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
303 ;; These constants depend on `cc-imenu-c++-generic-expression'. |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
304 ;; |
| 20916 | 305 (OBJC cc-imenu-objc-generic-expression-objc-base-index) |
| 306 ;; Special case to match a line like `main() {}' | |
| 307 (Cnoreturn cc-imenu-objc-generic-expression-noreturn-index) | |
| 308 ;; General function name regexp | |
| 309 (Cgeneralfunc cc-imenu-objc-generic-expression-general-func-index) | |
| 310 ;; Special case for definitions using phony prototype macros like: | |
| 311 (Cproto cc-imenu-objc-generic-expression-proto-index) | |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
312 langnum |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
313 ;; |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
314 (classcount 0) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
315 toplist |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
316 stupid |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
317 str |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
318 str2 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
319 (intflen (length "@interface")) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
320 (implen (length "@implementation")) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
321 (prtlen (length "@protocol")) |
| 20916 | 322 (func |
| 323 ;; | |
| 324 ;; Does this emacs has buffer-substring-no-properties? | |
| 325 ;; | |
| 326 (if (fboundp 'buffer-substring-no-properties) | |
| 327 'buffer-substring-no-properties | |
| 328 'buffer-substring))) | |
| 24282 | 329 (goto-char (point-max)) |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
330 (imenu-progress-message stupid 0) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
331 ;; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
332 (while (re-search-backward cc-imenu-objc-generic-expression nil t) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
333 (imenu-progress-message stupid) |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
334 (setq langnum (if (match-beginning OBJC) |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
335 OBJC |
|
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
336 (cond |
| 20916 | 337 ((match-beginning Cproto) Cproto) |
| 338 ((match-beginning Cgeneralfunc) Cgeneralfunc) | |
| 339 ((match-beginning Cnoreturn) Cnoreturn)))) | |
| 340 (setq str (funcall func (match-beginning langnum) (match-end langnum))) | |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
341 ;; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
342 (cond |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
343 ;; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
344 ;; C |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
345 ;; |
|
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
346 ((not (eq langnum OBJC)) |
|
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
347 (setq clist (cons (cons str (match-beginning langnum)) clist))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
348 ;; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
349 ;; ObjC |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
350 ;; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
351 ;; An instance Method |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
352 ((eq (aref str 0) ?-) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
353 (setq str (concat "-" (cc-imenu-objc-method-to-selector str))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
354 (setq methodlist (cons (cons str |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
355 (match-beginning langnum)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
356 methodlist))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
357 ;; A factory Method |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
358 ((eq (aref str 0) ?+) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
359 (setq str (concat "+" (cc-imenu-objc-method-to-selector str))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
360 (setq methodlist (cons (cons str |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
361 (match-beginning langnum)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
362 methodlist))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
363 ;; Interface or implementation or protocol |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
364 ((eq (aref str 0) ?@) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
365 (setq classcount (1+ classcount)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
366 (cond |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
367 ((and (> (length str) implen) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
368 (string= (substring str 0 implen) "@implementation")) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
369 (setq str (substring str implen) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
370 str2 "@implementation")) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
371 ((string= (substring str 0 intflen) "@interface") |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
372 (setq str (substring str intflen) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
373 str2 "@interface")) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
374 ((string= (substring str 0 prtlen) "@protocol") |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
375 (setq str (substring str prtlen) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
376 str2 "@protocol"))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
377 (setq str (cc-imenu-objc-remove-white-space str)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
378 (setq methodlist (cons (cons str2 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
379 (match-beginning langnum)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
380 methodlist)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
381 (setq toplist (cons nil (cons (cons str |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
382 methodlist) toplist)) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
383 methodlist nil)))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
384 ;; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
385 (imenu-progress-message stupid 100) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
386 (if (eq (car toplist) nil) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
387 (setq toplist (cdr toplist))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
388 |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
389 ;; In this buffer, there is only one or zero @{interface|implementation|protocol}. |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
390 (if (< classcount 2) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
391 (let ((classname (car (car toplist))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
392 (p (cdr (car (cdr (car toplist))))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
393 last) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
394 (setq toplist (cons (cons classname p) (cdr (cdr (car toplist))))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
395 ;; Add C lang token |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
396 (if clist |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
397 (progn |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
398 (setq last toplist) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
399 (while (cdr last) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
400 (setq last (cdr last))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
401 (setcdr last clist)))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
402 ;; Add C lang tokens as a sub menu |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
403 (setq toplist (cons (cons "C" clist) toplist))) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
404 ;; |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
405 toplist |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
406 )) |
|
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
407 |
| 24282 | 408 ;(defvar cc-imenu-pike-generic-expression |
| 409 ; ()) | |
| 410 ; FIXME: Please contribute one! | |
| 411 | |
| 26817 | 412 (defun cc-imenu-init (mode-generic-expression) |
| 413 (setq imenu-generic-expression mode-generic-expression | |
| 414 imenu-case-fold-search nil)) | |
| 415 | |
| 18720 | 416 |
| 36920 | 417 (cc-provide 'cc-menus) |
|
38422
7a94f1c588c4
Some fixes to follow coding conventions.
Pavel Jan?k <Pavel@Janik.cz>
parents:
36920
diff
changeset
|
418 |
| 18720 | 419 ;;; cc-menus.el ends here |
