Mercurial > emacs
annotate lisp/progmodes/cc-menus.el @ 27738:581c76c41ca4
(mark_object): Don't mark symbol names in pure space.
(gc_sweep): Don't unmark symbol names in pure space.
(toplevel): Include setjmp.h.
(PURE_POINTER_P): New define.
(enum mem_type) [GC_MARK_STACK]: New enumeration.
(Vdead) [GC_MARK_STACK]: New variable.
(lisp_malloc): Add parameter TYPE, call mem_insert if
GC_MARK_STACK is defined.
(allocate_buffer): New function.
(lisp_free) [GC_MARK_STACK]: Call mem_delete.
(free_float) [GC_MARK_STACK]: Set type to Vdead.
(free_cons) [GC_MARK_STACK]: Set car to Vdead.
(stack_base, mem_root, mem_z) [GC_MARK_STACK]: New variables.
(MEM_NIL) [GC_MARK_STACK]: New define.
(struct mem_node) [GC_MARK_STACK]: New structure.
(mem_init, mem_find, mem_insert, mem_delete, mem_insert_fixup)
(mem_delete_fixup, mem_rotate_left, mem_rotate_right)
(live_string_p, live_cons_p, live_symbol_p, live_float_p)
(live_misc_p, live_vector_p, live_buffer_p, mark_memory)
(mark_stack) [GC_MARK_STACK]: New functions.
(Fgarbage_collect) [GC_MARK_STACK]: Call mark_stack.
(clear_marks): Removed.
(gc_sweep): Set free conses' car, free floats' type, free
symbols' function to Vdead. Use lisp_free to free buffers.
(init_alloc_once): Initialize Vdead.
(survives_gc_p): Return non-zero for pure objects.
Add comments throughout the file.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Thu, 17 Feb 2000 15:21:21 +0000 |
parents | 03befb219d03 |
children | f1a6dfd30c21 |
rev | line source |
---|---|
18720 | 1 ;;; cc-menus.el --- imenu support for CC Mode |
2 | |
26817 | 3 ;; Copyright (C) 1985,1987,1992-1999 Free Software Foundation, Inc. |
18720 | 4 |
26817 | 5 ;; Authors: 1998-1999 Barry A. Warsaw and Martin Stjernholm |
24282 | 6 ;; 1992-1997 Barry A. Warsaw |
18720 | 7 ;; 1987 Dave Detlefs and Stewart Clamen |
8 ;; 1985 Richard M. Stallman | |
24282 | 9 ;; Maintainer: bug-cc-mode@gnu.org |
18720 | 10 ;; 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
|
11 ;; Version: See cc-mode.el |
18720 | 12 ;; Keywords: c languages oop |
13 | |
14 ;; This file is part of GNU Emacs. | |
15 | |
16 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
17 ;; it under the terms of the GNU General Public License as published by | |
18 ;; the Free Software Foundation; either version 2, or (at your option) | |
19 ;; any later version. | |
20 | |
21 ;; GNU Emacs is distributed in the hope that it will be useful, | |
22 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
23 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
24 ;; GNU General Public License for more details. | |
25 | |
26 ;; You should have received a copy of the GNU General Public License | |
27 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
28 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
29 ;; Boston, MA 02111-1307, USA. | |
30 | |
24282 | 31 (eval-when-compile |
26817 | 32 (let ((load-path |
33 (if (and (boundp 'byte-compile-current-file) | |
34 (stringp byte-compile-current-file)) | |
35 (cons (file-name-directory byte-compile-current-file) | |
36 load-path) | |
37 load-path))) | |
38 (load "cc-defs" nil t))) | |
39 | |
40 ;; Dummy definitions to shut up the compiler in case imenu doesn't exist. | |
41 (defvar imenu-generic-expression) | |
42 (defvar imenu-case-fold-search) | |
43 (or (fboundp 'imenu-progress-message) | |
44 (defun imenu-progress-message (&rest args) nil)) | |
45 | |
46 ;; Try to pull in imenu. | |
47 (eval-and-compile | |
24282 | 48 (condition-case nil |
49 (require 'imenu) | |
50 (error nil))) | |
51 | |
18720 | 52 |
53 ;; imenu integration | |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
54 (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
|
55 "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
|
56 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
57 For example: |
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 #ifdef __STDC__ |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
60 #define _P(x) x |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
61 #else |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
62 #define _P(x) /*nothing*/ |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
63 #endif |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
64 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
65 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
|
66 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
67 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
|
68 |
18720 | 69 (defvar cc-imenu-c++-generic-expression |
26817 | 70 `( |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
71 ;; 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
|
72 ;; 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
|
73 ;; 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
|
74 (nil |
26817 | 75 ,(concat |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
76 "^\\<.*" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
77 "[^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
|
78 ; (note: this can be `\n') |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
79 "\\(" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
80 "\\([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
|
81 "operator\\>[ \t]*" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
82 "\\(()\\|[^(]*\\)" ; special case for `()' operator |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
83 "\\)" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
84 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
85 "[ \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
|
86 ; require something other than |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
87 ; a `;' after the (...) to |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
88 ; avoid prototypes. Can't |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
89 ; catch cases with () inside |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
90 ; the parentheses surrounding |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
91 ; the parameters. e.g.: |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
92 ; `int foo(int a=bar()) {...}' |
26817 | 93 ) 1) |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
94 ;; 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
|
95 ;; 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
|
96 (nil |
26817 | 97 ,(concat |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
98 "^" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
99 "\\([a-zA-Z_][a-zA-Z0-9_:<>~]*\\)" ; match function name |
20916 | 100 "[ \t]*(" ; see above, BUT |
101 "[ \t]*\\([^ \t(*][^)]*\\)?)" ; the arg list must not start | |
102 "[ \t]*[^ \t;(]" ; with an asterisk or parentheses | |
26817 | 103 ) 1) |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
104 ;; General function name regexp |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
105 (nil |
26817 | 106 ,(concat |
107 "^\\<" ; line MUST start with word char | |
108 "[^()]*" ; no parentheses before | |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
109 "[^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
|
110 "\\([a-zA-Z_][a-zA-Z0-9_:<>~]*\\)" ; match function name |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
111 "[ \t]*(" ; see above, BUT |
20916 | 112 "[ \t]*\\([^ \t(*][^)]*\\)?)" ; the arg list must not start |
113 "[ \t]*[^ \t;(]" ; with an asterisk or parentheses | |
26817 | 114 ) 1) |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
115 ;; 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
|
116 ;; `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
|
117 ;; 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
|
118 ;; Only supported in c-code, so no `:<>~' chars in function name! |
26817 | 119 ,@(if cc-imenu-c-prototype-macro-regexp |
120 `((nil | |
121 ,(concat | |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
122 "^\\<.*" ; line MUST start with word char |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
123 "[^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
|
124 "\\([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
|
125 "[ \t]*" ; whitespace before macro name |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
126 cc-imenu-c-prototype-macro-regexp |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
127 "[ \t]*(" ; ws followed by first paren. |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
128 "[ \t]*([^)]*)[ \t]*)[ \t]*[^ \t;]" ; see above |
26817 | 129 ) 1))) |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
130 ;; Class definitions |
18720 | 131 ("Class" |
26817 | 132 ,(concat |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
133 "^" ; beginning of line is required |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
134 "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a `template <...>' |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
135 "class[ \t]+" |
24282 | 136 "\\(" ; the string we want to get |
137 "[a-zA-Z0-9_]+" ; class name | |
138 "\\(<[^>]+>\\)?" ; possibly explicitely specialized | |
139 "\\)" | |
26817 | 140 "[ \t\n]*[:{]" |
141 ) 2)) | |
18720 | 142 "Imenu generic expression for C++ mode. See `imenu-generic-expression'.") |
143 | |
144 (defvar cc-imenu-c-generic-expression | |
145 cc-imenu-c++-generic-expression | |
146 "Imenu generic expression for C mode. See `imenu-generic-expression'.") | |
147 | |
148 (defvar cc-imenu-java-generic-expression | |
26817 | 149 `((nil |
150 ,(concat | |
18720 | 151 "^\\([ \t]\\)*" |
26817 | 152 "\\([.A-Za-z0-9_-]+[ \t]+\\)?" ; type specs; there can be |
153 "\\([.A-Za-z0-9_-]+[ \t]+\\)?" ; more than 3 tokens, right? | |
154 "\\([.A-Za-z0-9_-]+[ \t]*[[]?[]]?\\)" | |
18720 | 155 "\\([ \t]\\)" |
156 "\\([A-Za-z0-9_-]+\\)" ; the string we want to get | |
24282 | 157 "\\([ \t]*\\)+(" |
26817 | 158 "[][a-zA-Z,_1-9\n \t]*" ; arguments |
18720 | 159 ")[ \t]*" |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
160 ; "[^;(]" |
18720 | 161 "[,a-zA-Z_1-9\n \t]*{" |
26817 | 162 ) 6)) |
18720 | 163 "Imenu generic expression for Java mode. See `imenu-generic-expression'.") |
164 | |
20916 | 165 ;; *Warning for cc-mode developers* |
166 ;; | |
167 ;; `cc-imenu-objc-generic-expression' elements depend on | |
168 ;; `cc-imenu-c++-generic-expression'. So if you change this | |
169 ;; expression, you need to change following variables, | |
170 ;; `cc-imenu-objc-generic-expression-*-index', | |
171 ;; too. `cc-imenu-objc-function' uses these *-index variables, in | |
172 ;; order to know where the each regexp *group \\(foobar\\)* elements | |
173 ;; are started. | |
174 ;; | |
175 ;; *-index variables are initialized during `cc-imenu-objc-generic-expression' | |
176 ;; being initialized. | |
177 ;; | |
178 | |
179 ;; Internal variables | |
180 (defvar cc-imenu-objc-generic-expression-noreturn-index nil) | |
181 (defvar cc-imenu-objc-generic-expression-general-func-index nil) | |
182 (defvar cc-imenu-objc-generic-expression-proto-index nil) | |
183 (defvar cc-imenu-objc-generic-expression-objc-base-index nil) | |
184 | |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
185 (defvar cc-imenu-objc-generic-expression |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
186 (concat |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
187 ;; |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
188 ;; For C |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
189 ;; |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
190 ;; > Special case to match a line like `main() {}' |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
191 ;; > 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
|
192 ;; Pick a token by (match-string 1) |
20916 | 193 (car (cdr (nth 1 cc-imenu-c++-generic-expression))) ; -> index += 2 |
194 (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
|
195 "\\|" |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
196 ;; > General function name regexp |
20916 | 197 ;; Pick a token by (match-string 3) |
198 (car (cdr (nth 2 cc-imenu-c++-generic-expression))) ; -> index += 2 | |
199 (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
|
200 ;; > 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
|
201 ;; > `int main _PROTO( (int argc,char *argv[]) )'. |
20916 | 202 ;; Pick a token by (match-string 5) |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
203 (if cc-imenu-c-prototype-macro-regexp |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
204 (concat |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
205 "\\|" |
20916 | 206 (car (cdr (nth 3 cc-imenu-c++-generic-expression))) ; -> index += 1 |
207 (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 6) "") | |
208 ) | |
209 (prog2 (setq cc-imenu-objc-generic-expression-objc-base-index 5) "") | |
210 "") ; -> index += 0 | |
211 (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
|
212 ;; |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
213 ;; For Objective-C |
20916 | 214 ;; 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
|
215 ;; |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
216 "\\|\\(" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
217 "^[-+][: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
|
218 "\\|" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
219 "^@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
|
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 ]*([a-zA-Z0-9_]+)" |
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 ;; 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
|
224 "^@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
|
225 "\\|" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
226 "^@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
|
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_]+" |
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 "^@protocol[\t ]+[a-zA-Z0-9_]+" "\\)") |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
231 "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
|
232 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
233 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
234 ;; 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
|
235 (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
|
236 "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
|
237 Example: |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
238 - 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
|
239 => |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
240 -perform:withObject:withObject:withObject: /* selector */" |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
241 (let ((return "") ; String to be returned |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
242 (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
|
243 (pmax (length method)) ; |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
244 char ; Current scanning target |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
245 (betweenparen 0) ; CHAR is in parentheses. |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
246 argreq ; An argument is required. |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
247 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
|
248 (while (< p pmax) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
249 (setq char (aref method p) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
250 p (1+ p)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
251 (cond |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
252 ;; 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
|
253 ((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
|
254 (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
|
255 (or (and (<= ?a char) (<= char ?z)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
256 (and (<= ?A char) (<= char ?Z)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
257 (and (<= ?0 char) (<= char ?9)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
258 (= ?_ char))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
259 (if argreq |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
260 (setq inargvar t |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
261 argreq nil) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
262 (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
|
263 ;; Or a white space? |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
264 ((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
|
265 (setq inargvar nil))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
266 ;; Or a method separator? |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
267 ;; 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
|
268 ((eq ?: char) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
269 (setq argreq t |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
270 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
|
271 ;; Or an open parentheses? |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
272 ((eq ?\( char) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
273 (setq betweenparen (1+ betweenparen))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
274 ;; Or a close parentheses? |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
275 ((eq ?\) char) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
276 (setq betweenparen (1- betweenparen))))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
277 return)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
278 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
279 (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
|
280 "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
|
281 (let ((return "") |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
282 (p 0) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
283 (max (length str)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
284 char) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
285 (while (< p max) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
286 (setq char (aref str p)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
287 (setq p (1+ p)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
288 (if (or (= char ?\ ) (= char ?\t)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
289 () |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
290 (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
|
291 return)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
292 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
293 (defun cc-imenu-objc-function () |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
294 "imenu supports for objc-mode." |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
295 (let (methodlist |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
296 clist |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
297 ;; |
20916 | 298 ;; OBJC, Cnoreturn, Cgeneralfunc, Cproto are constants. |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
299 ;; |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
300 ;; *Warning for developers* |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
301 ;; 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
|
302 ;; |
20916 | 303 (OBJC cc-imenu-objc-generic-expression-objc-base-index) |
304 ;; Special case to match a line like `main() {}' | |
305 (Cnoreturn cc-imenu-objc-generic-expression-noreturn-index) | |
306 ;; General function name regexp | |
307 (Cgeneralfunc cc-imenu-objc-generic-expression-general-func-index) | |
308 ;; Special case for definitions using phony prototype macros like: | |
309 (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
|
310 langnum |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
311 ;; |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
312 (classcount 0) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
313 toplist |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
314 stupid |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
315 str |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
316 str2 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
317 (intflen (length "@interface")) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
318 (implen (length "@implementation")) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
319 (prtlen (length "@protocol")) |
20916 | 320 (func |
321 ;; | |
322 ;; Does this emacs has buffer-substring-no-properties? | |
323 ;; | |
324 (if (fboundp 'buffer-substring-no-properties) | |
325 'buffer-substring-no-properties | |
326 'buffer-substring))) | |
24282 | 327 (goto-char (point-max)) |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
328 (imenu-progress-message stupid 0) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
329 ;; |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
330 (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
|
331 (imenu-progress-message stupid) |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
332 (setq langnum (if (match-beginning OBJC) |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
333 OBJC |
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
334 (cond |
20916 | 335 ((match-beginning Cproto) Cproto) |
336 ((match-beginning Cgeneralfunc) Cgeneralfunc) | |
337 ((match-beginning Cnoreturn) Cnoreturn)))) | |
338 (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
|
339 ;; |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
340 (cond |
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 ;; C |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
343 ;; |
20145
cfd9922ca72b
Patches to Imenu support given by
Karl Heuer <kwzh@gnu.org>
parents:
20134
diff
changeset
|
344 ((not (eq langnum OBJC)) |
20134
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
345 (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
|
346 ;; |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
347 ;; ObjC |
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 ;; An instance Method |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
350 ((eq (aref str 0) ?-) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
351 (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
|
352 (setq methodlist (cons (cons str |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
353 (match-beginning langnum)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
354 methodlist))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
355 ;; A factory Method |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
356 ((eq (aref str 0) ?+) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
357 (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
|
358 (setq methodlist (cons (cons str |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
359 (match-beginning langnum)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
360 methodlist))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
361 ;; Interface or implementation or protocol |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
362 ((eq (aref str 0) ?@) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
363 (setq classcount (1+ classcount)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
364 (cond |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
365 ((and (> (length str) implen) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
366 (string= (substring str 0 implen) "@implementation")) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
367 (setq str (substring str implen) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
368 str2 "@implementation")) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
369 ((string= (substring str 0 intflen) "@interface") |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
370 (setq str (substring str intflen) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
371 str2 "@interface")) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
372 ((string= (substring str 0 prtlen) "@protocol") |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
373 (setq str (substring str prtlen) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
374 str2 "@protocol"))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
375 (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
|
376 (setq methodlist (cons (cons str2 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
377 (match-beginning langnum)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
378 methodlist)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
379 (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
|
380 methodlist) toplist)) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
381 methodlist nil)))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
382 ;; |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
383 (imenu-progress-message stupid 100) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
384 (if (eq (car toplist) nil) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
385 (setq toplist (cdr toplist))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
386 |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
387 ;; 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
|
388 (if (< classcount 2) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
389 (let ((classname (car (car toplist))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
390 (p (cdr (car (cdr (car toplist))))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
391 last) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
392 (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
|
393 ;; Add C lang token |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
394 (if clist |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
395 (progn |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
396 (setq last toplist) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
397 (while (cdr last) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
398 (setq last (cdr last))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
399 (setcdr last clist)))) |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
400 ;; 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
|
401 (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
|
402 ;; |
7eb314cf3574
(cc-imenu-c-prototype-macro-regexp): New var.
Karl Heuer <kwzh@gnu.org>
parents:
19809
diff
changeset
|
403 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 |
24282 | 406 ;(defvar cc-imenu-pike-generic-expression |
407 ; ()) | |
408 ; FIXME: Please contribute one! | |
409 | |
26817 | 410 (defun cc-imenu-init (mode-generic-expression) |
411 (setq imenu-generic-expression mode-generic-expression | |
412 imenu-case-fold-search nil)) | |
413 | |
18720 | 414 |
415 (provide 'cc-menus) | |
416 ;;; cc-menus.el ends here |