annotate lisp/oobr/br-objc.el @ 164:4e0740e5aab2

Added tag r20-3b8 for changeset 0132846995bd
author cvs
date Mon, 13 Aug 2007 09:43:39 +0200
parents 4be1180a9e89
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 ;;!emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 ;; FILE: br-objc.el
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 ;; SUMMARY: Support routines for Objective-C inheritance browsing.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 ;; USAGE: GNU Emacs Lisp Library
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 ;; KEYWORDS: c, oop, tools
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 ;; AUTHOR: Bob Weiner
100
4be1180a9e89 Import from CVS: tag r20-1b2
cvs
parents: 70
diff changeset
9 ;; ORG: InfoDock Associates
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 ;; ORIG-DATE: 7-Dec-89
100
4be1180a9e89 Import from CVS: tag r20-1b2
cvs
parents: 70
diff changeset
12 ;; LAST-MOD: 21-Feb-97 at 17:22:55 by Bob Weiner
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ;;
100
4be1180a9e89 Import from CVS: tag r20-1b2
cvs
parents: 70
diff changeset
14 ;; Copyright (C) 1989-1995, 1997 Free Software Foundation, Inc.
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 ;; See the file BR-COPY for license information.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 ;; This file is part of the OO-Browser.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 ;; DESCRIPTION:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 ;; See 'objc-class-def-regexp' for regular expression that matches class
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 ;; definitions.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 ;; DESCRIP-END.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 ;;; Other required Elisp libraries
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 (mapcar 'require '(br-lib br-c-ft))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 ;;; Public variables
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 (defvar objc-lib-search-dirs nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 "List of directories below which Objective-C Library source files are found.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 Subdirectories of Library source are also searched. A Library is a stable
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 group of classes.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 (defvar objc-sys-search-dirs nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 "List of directories below which Objective-C System source files are found.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 Subdirectories of System source are also searched. A System class is one
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 that is not yet reusable and is likely to change before release.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 (defconst objc-narrow-view-to-class nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 "*Non-nil means narrow buffer to just the matching class definition when displayed.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 ;;; Public functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 (defun objc-get-classes-from-source (filename &optional skip-tags
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 skip-tags-cleanup)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 "Scans FILENAME and returns cons of class list with parents-class alist.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 Assumes file existence and readability have already been checked.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 With optional SKIP-TAGS non-nil, does not compute and store lookup tags
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 for feature definitions. If SKIP-TAGS is nil, normally a cleanup
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 routine is called after scanning the features. SKIP-TAGS-CLEANUP
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 non-nil suppresses this action."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 (let ((no-kill (get-file-buffer filename))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 (parents-and-class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 (signatures)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 class class-of-category class-separator class-type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 classes category def-match-data in-comment-flag parent-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 protocol-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 (if no-kill
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 (set-buffer no-kill)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 (funcall br-view-file-function filename))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 (save-restriction
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 (widen)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 (goto-char (point-min))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 (if skip-tags
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 ;; Get all method definitions within this file.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 (setq signatures (objc-scan-features))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 (goto-char (point-min)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 ;; Search for class or protocol interface specification.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 (while (re-search-forward objc-class-def-regexp nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 (setq class nil class-type nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 category nil parent-list nil protocol-list nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 def-match-data (match-data))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 ;; If definition is within a C comment, ignore it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 ;; Regexp used for matching a def precludes any "//"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 ;; comment.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 (if (setq in-comment-flag
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 (and (c-within-comment-p) (search-forward "*/" nil t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 (store-match-data def-match-data)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 (setq class-type (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 (match-beginning objc-class-def-type-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 (match-end objc-class-def-type-grpn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 class-separator
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 (if (match-beginning objc-class-def-separator-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 (match-beginning objc-class-def-separator-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 (match-end objc-class-def-separator-grpn)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 (cond (in-comment-flag) ;; Ignore
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 ((string-equal class-type "@interface")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 ;; Class or category definition
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 (setq class (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 (match-beginning objc-class-name-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 (match-end objc-class-name-grpn)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 (cond ((null class-separator)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 ;; top class definition without any protocols,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 ;; nothing more to do
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 ((string-equal class-separator ":")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 ;; class definition with parent
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 (if (re-search-forward objc-parent-regexp nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 (setq parent-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 (list (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 (match-beginning
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 objc-parent-name-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 (match-end objc-parent-name-grpn))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 (error "(objc-get-classes-from-source): '%s' parent definition is invalid."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 class))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 ;; Check if class conforms to protocol list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 (if (and (null skip-tags) (= (following-char) ?\<))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 (setq protocol-list (objc-scan-protocol-list))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 ((string-equal class-separator "\(")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 ;; class category definition
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 (if (null skip-tags)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 ;; Check if class conforms to protocol list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 (skip-chars-forward " \t\n\r")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 (setq class-of-category
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 (match-beginning objc-class-name-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 (match-end objc-class-name-grpn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 category
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 (if (looking-at objc-identifier)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 (goto-char (match-end 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 (skip-chars-forward "\) \t\n\r")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 (concat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 "\(" (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 (match-beginning
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 objc-identifier-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 (match-end
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 objc-identifier-grpn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 "\)"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 ;; If get here, there is a problem.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 (error "(objc-get-classes-from-source): '%s' class contains invalid category () delimiters"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 class (concat class-of-category category)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 signatures
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 ;; Add this category def to the default
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 ;; categories class.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 (cons (objc-feature-normalize
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 ;; Yes, this net line should be
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 ;; (category)class-of-category.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 (concat category class-of-category)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 objc-default-category-class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 ;; Add a category tag to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 ;; class-of-category.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 (cons (objc-feature-normalize
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 category
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 class-of-category)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 signatures)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 ;; Check if category conforms to protocol list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 (if (= (following-char) ?\<)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 (setq protocol-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 (objc-scan-protocol-list))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 ((string-equal class-separator "\<")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 ;; top class definition conforming to protocols
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 (if (null skip-tags)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 (setq protocol-list (objc-scan-protocol-list))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 ;; If get here, there is a bug, so signal an error.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 (t (error "(objc-get-classes-from-source): '%s' class uses '%s' unhandled definition separator"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 class class-separator))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 (t
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 ;; Protocol definition
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 ;; Record '<'protocol-name '>' as a class along with its
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 ;; parent protocols, if any.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 ;; If not skip-tags, add the protocol's method
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 ;; *declarations* as feature tags.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 (setq class (concat "<"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 (match-beginning objc-class-name-grpn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 (match-end objc-class-name-grpn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 ">")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 parent-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 (if (string-equal class-separator "\<")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 (objc-scan-protocol-list)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 (if (null skip-tags)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 (setq signatures
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 ;; Add this protocol def to the default protocols
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 ;; class.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 (cons (objc-feature-normalize
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 class objc-default-protocol-class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 signatures)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 (if (null class-type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 (if class (setq classes (cons class classes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 parents-and-class
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 (cons (cons parent-list class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 parents-and-class)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 (if protocol-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 ;; record all of class' protocols as tags
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 (setq signatures
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 (nconc signatures
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 (mapcar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 (function (lambda (protocol)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 (objc-feature-normalize
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 protocol class)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 protocol-list))))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 (if skip-tags
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 (objc-get-feature-tags buffer-file-name signatures)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 (or skip-tags-cleanup (br-feature-tags-save)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 (or no-kill (kill-buffer (current-buffer)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 (cons classes (delq nil parents-and-class))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 (defun objc-get-parents-from-source (filename class-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 "Scan source in FILENAME and return list of parents of CLASS-NAME.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 Assume file existence has already been checked."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 (or (null class-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 (car (car (br-rassoc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 class-name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 (cdr (objc-get-classes-from-source filename t)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 (defun objc-select-path (paths-htable-elt &optional feature-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 "Select proper pathname from PATHS-HTABLE-ELT based upon value of optional FEATURE-P.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 Selection is between path of class definition and path for features associated
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 with the class."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 (let ((elt (cdr paths-htable-elt)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 (if (consp elt)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 (if feature-p (cdr elt) (car elt))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 ;; Both paths are the same.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 elt)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 (defun objc-set-case (type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 "Return string TYPE identifier for use as a class name."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 (defun objc-set-case-type (class-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 "Return string CLASS-NAME for use as a type identifier."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 class-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 (defun objc-to-class-end ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 "Assuming point is at start of class, move to start of line after end of class."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 (interactive)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 (condition-case ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 (forward-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 (error (progn (or (re-search-forward "^}" nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 (goto-char (point-max))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 (forward-line 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 (defun objc-to-comments-begin ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 "Skip back from current point past any preceding Objective-C comments.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 Presumes no \"/*\" strings are nested within multi-line comments."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 (let ((opoint))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 (while
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 (progn (setq opoint (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 ;; To previous line
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 (if (= 0 (forward-line -1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 (cond
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 ;; If begins with "//" or ends with "*/", then is a comment.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 ((looking-at "[ \t]*\\(//\\|$\\)"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 ((looking-at ".*\\*/[ \t]*$")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 (progn (end-of-line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 (search-backward "/*" nil t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 (nil)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 (goto-char opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 ;; Skip past whitespace
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 (skip-chars-forward " \t\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 (beginning-of-line)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 ;;; Private variables
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283 (defconst objc-class-keyword
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 "\\(@interface\\|@protocol\\)[ \t\n]+"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285 "Keyword regexp preceding an Objective-C class or protocol definition.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 Type of definition is indicated by grouping 'objc-class-def-type-grpn'.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 (defconst objc-class-def-type-grpn 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290 (defconst objc-class-name-before
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 (concat "^[ \t]*" objc-class-keyword)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 "Regexp preceding the class name in a class definition.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 (defconst objc-class-name-after
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 "\\([ \t\n]+//.*[\n]\\)*[ \t\n]*\\([:\<\(]\\)?"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 "Regexp following the class name in a class definition.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 (defconst objc-interface-before
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 "^[ \t]*\\(@interface\\)[ \t\n]+"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 "Regexp preceding the class name in a non-protocol class definition.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302 (defconst objc-implementation-before
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 "^[ \t]*\\(@implementation\\)[ \t\n]+"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 "Regexp preceding the class name in a class method definition section.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 (defconst objc-protocol-before
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 "^[ \t]*\\(@protocol\\)[ \t\n]+"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 "Regexp preceding the protocol name in a formal protocol definition.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 (defconst objc-identifier-chars "_a-zA-Z0-9"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311 "String of chars and char ranges that may be used within an Objective-C identifier.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 (defconst objc-identifier
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314 (concat "\\([_a-zA-Z][" objc-identifier-chars "]*\\)")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 "Regular expression matching an Objective-C identifier.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 The identifier is grouping 'objc-identifier-grpn'.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 (defconst objc-identifier-grpn 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 (defconst objc-class-def-regexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 (concat objc-class-name-before objc-identifier objc-class-name-after)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 "Regular expression used to match to class definitions in source text.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 Type of definition is indicated by grouping 'objc-class-def-type-grpn'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 Class name identifier is grouping 'objc-class-name-grpn'. Entire grouped
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 expression ends with one of the following (optional grouping
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 'objc-class-def-separator-grpn'):
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 a ':', indicating that class inherits from parent class following the colon;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 a '\(', indicating a class category definition;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 a '<', indicating protocols to which class conforms;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330 no grouping match, indicating that this is a root class with no parent.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 (defconst objc-class-def-separator-grpn 4)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 (defconst objc-lang-prefix "objc-"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335 "Prefix string that starts \"br-objc.el\" symbol names.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337 (defconst objc-parent-regexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 (concat "[ \t\n]*" objc-identifier "\\([ \t\n]+//.*[\n]\\)?[ \t\n]*")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339 "Parent identifier is grouping 'objc-parent-name-grpn'.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 (defconst objc-parent-name-grpn 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 (defconst objc-src-file-regexp ".\\.[hcmHCM]$"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 "Regular expression matching a unique part of Objective-C source or header file name and no others.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 (defvar objc-children-htable nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347 "Htable whose elements are of the form: (LIST-OF-CHILD-CLASSES . CLASS-NAME).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 Used to traverse Objective-C inheritance graph. 'br-build-children-htable' builds
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 this list.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 (defvar objc-parents-htable nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 "Htable whose elements are of the form: (LIST-OF-PARENT-CLASSES . CLASS-NAME).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 Used to traverse Objective-C inheritance graph. 'br-build-parents-htable' builds
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 this list.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 (defvar objc-paths-htable nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 "Htable whose elements are of the form: (LIST-OF-CLASS-NAMES . FILE-PATH).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 FILE-PATH gives the location of classes found in LIST-OF-CLASS-NAMES.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 'br-build-paths-htable' builds this list.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 (defvar objc-lib-parents-htable nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 "Htable whose elements are of the form: (LIST-OF-PARENT-CLASSES . CLASS-NAME).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 Only classes from stable software libraries are used to build the list.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 (defvar objc-lib-paths-htable nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 "Htable whose elements are of the form: (LIST-OF-CLASS-NAMES . FILE-PATH).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 FILE-PATH gives the location of classes found in LIST-OF-CLASS-NAMES.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 Only classes from stable software libraries are used to build the list.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 (defvar objc-sys-parents-htable nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 "Htable whose elements are of the form: (LIST-OF-PARENT-CLASSES . CLASS-NAME).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 Only classes from systems that are likely to change are used to build the list.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371 (defvar objc-sys-paths-htable nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372 "Alist whose elements are of the form: (LIST-OF-CLASS-NAMES . FILE-PATH).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373 FILE-PATH gives the location of classes found in LIST-OF-CLASS-NAMES.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 Only classes from systems that are likely to change are used to build the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 list.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377 (defvar objc-lib-prev-search-dirs nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 "Used to check if 'objc-lib-classes-htable' must be regenerated.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 (defvar objc-sys-prev-search-dirs nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380 "Used to check if 'objc-sys-classes-htable' must be regenerated.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 (defvar objc-env-spec nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383 "Non-nil value means Environment specification has been given but not yet built.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 Nil means current Environment has been built, though it may still require updating.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 (provide 'br-objc)