annotate lisp/oobr/br-eif-ft.el @ 36:c53a95d3c46d r19-15b101

Import from CVS: tag r19-15b101
author cvs
date Mon, 13 Aug 2007 08:53:38 +0200
parents 4103f0995bd7
children 131b0175ea99
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-eif-ft.el
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 ;; SUMMARY: Eiffel OO-Browser class and feature functions.
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: 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
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
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: 03-Oct-90
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
12 ;; LAST-MOD: 31-Oct-96 at 17:05:31 by Bob Weiner
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ;;
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
14 ;; Copyright (C) 1990-1996 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 ;; DESCRIP-END.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
22 ;;; ************************************************************************
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
23 ;;; Other required Elisp libraries
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
24 ;;; ************************************************************************
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 (require 'eif-calls)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
28 ;;; ************************************************************************
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
29 ;;; Public variables
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
30 ;;; ************************************************************************
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 (defconst eif-type-tag-separator ","
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 "String that separates a tags type from its normalized definition form.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
35 ;;; ************************************************************************
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
36 ;;; Public functions
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
37 ;;; ************************************************************************
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 (defun eif-feature-implementors (ftr-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 "Return unsorted list of Eiffel feature tags which implement FTR-NAME."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 (eif-feature-matches (concat "^" (regexp-quote ftr-name) "$")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
43 (defun eif-feature-map-class-tags (function class)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
44 "Apply FUNCTION to all feature tags from CLASS and return a list of the results.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
45 Feature tags come from the file named by br-feature-tags-file."
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
46 (let ((obuf (current-buffer))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
47 (class-tag (concat "\n" class eif-type-tag-separator))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
48 (results)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
49 start end)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
50 (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
51 (goto-char 1)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
52 (if (not (search-forward class-tag nil t))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
53 nil
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
54 (setq start (match-beginning 0)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
55 end (if (search-forward "\^L\n" nil t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
56 (match-beginning 0)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
57 (point-max)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
58 (goto-char start)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
59 ;; Feature defs can occur only within a single file.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
60 (while (search-forward class-tag end t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
61 (setq results (cons (funcall function) results))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
62 ;; Might have deleted current tag and would miss next tag unless point
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
63 ;; is moved backwards.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
64 (backward-char)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
65 (set-buffer obuf)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
66 results))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
67
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 (defun eif-feature-name-to-regexp (name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 "Converts feature NAME into a regular expression matching the feature's name tag."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 (if (string-match (concat "^" br-feature-type-regexp " ") name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 (setq name (substring name (match-end 0))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 (format "%s%s%s %s[ \n]"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 eif-identifier eif-type-tag-separator br-feature-type-regexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 (regexp-quote name)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 (fset 'eif-feature-signature-to-name 'eif-feature-partial-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 (defun eif-feature-signature-to-regexp (signature)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 "Given an Eiffel class or feature SIGNATURE, return regexp to match its definition."
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
80 (let ((regexp) name type)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 (setq regexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 (cond ((string-match (concat eif-type-tag-separator
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 "\\(" br-feature-type-regexp "\\) ")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 signature)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 (setq name (substring signature (match-end 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 type (string-to-char
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 (substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 signature (match-beginning 1) (match-end 1))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 (cond ((memq type '(?- ?1 ?>))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 ;; routine
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 (eif-routine-to-regexp name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 ((= type ?=)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 ;; attribute
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 (eif-attribute-to-regexp name))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 ((equal 0 (string-match eif-identifier signature))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 ;; Assume is a class name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 (concat eif-class-name-before (regexp-quote signature)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 eif-class-name-after))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 (or regexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 (error "(eif-feature-signature-to-regexp): Invalid format, '%s'"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 signature))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
103 (defun eif-feature-tag-regexp (class feature-name)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
104 "Return a regexp that matches to the feature tag entry for CLASS' FEATURE-NAME."
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
105 (concat "^" (regexp-quote class) eif-type-tag-separator
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
106 br-feature-type-regexp " "
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
107 (regexp-quote feature-name) "[ \n]"))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
108
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 (defun eif-feature-tree-command-p (class-or-signature)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 "Display definition of CLASS-OR-SIGNATURE if a signature and return t, else return nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 (if (br-in-browser) (br-to-view-window))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 (br-feature-found-p (br-feature-file class-or-signature)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 class-or-signature))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 (defun eif-get-feature-tags (feature-file feature-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 "Save Eiffel feature tags defined in FEATURE-FILE to 'br-feature-tags-file'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 Assume FEATURE-FILE has already been read into a buffer and that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 'br-feature-tags-init' has been called. FEATURE-LIST is the list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 of tags to save."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 (interactive)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 (let ((obuf (current-buffer)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 (goto-char 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 ;; Delete any prior feature tags associated with feature-file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 (if (search-forward feature-file nil 'end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 (progn (forward-line -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 (let ((start (point)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 (search-forward "\^L" nil 'end 2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 (backward-char 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 (delete-region start (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 )))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 (if feature-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 (progn (insert "\^L\n" feature-file "\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 (mapcar (function (lambda (tag) (insert tag "\n")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 feature-list)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 (set-buffer obuf)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
139 (defun eif-list-features (class &optional indent)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
140 "Return sorted list of Eiffel feature names lexically defined in CLASS.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
141 Optional INDENT is unused but is required for multi-language OO-Browser conformance."
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
142 ;; Use nreverse here so that stable sort ends up leaving same named
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
143 ;; features in the order they were defined in the source file.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
144 (eif-sort-features
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
145 (eif-feature-map-class-tags 'br-feature-current class)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
146
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 (defun eif-scan-features-in-class (class start end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 "Return unordered list of Eiffel feature definitions in CLASS.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 START and END give buffer region to search."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 (save-restriction
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 (narrow-to-region start end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 (goto-char start)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 (let ((attributes-and-routines (eif-parse-features t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 (append
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 (mapcar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 (function (lambda (routine)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 (concat class eif-type-tag-separator routine)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 (cdr attributes-and-routines))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 (mapcar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 (function (lambda (attribute)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 (concat class eif-type-tag-separator attribute)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 (car attributes-and-routines)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 (defun eif-sort-features (feature-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 (sort feature-list 'eif-feature-lessp))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 (defun eif-to-definition (&optional identifier)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 "If point is within an Eiffel class or feature name, try to move to its definition.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 With optional IDENTIFIER, do the same instead for it."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 (interactive)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 (let ((cl (or identifier (eif-find-class-name))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 (cond
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 ((eif-keyword-p) nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 ((br-check-for-class cl))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 ((eif-feature cl))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 ((progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 (beep)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 (message
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 "(OO-Browser): Select an Eiffel identifier to move to its definition.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 nil))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 )))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
184 ;;; ************************************************************************
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
185 ;;; Private functions
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
186 ;;; ************************************************************************
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 (defun eif-export-feature-p ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 "Return nil unless point is within a class export clause."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 (let ((end (point)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 (beginning-of-line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 ;; If in a comment, return nil.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 (if (search-forward "--" end t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 (goto-char (point-min))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 (and (re-search-forward eif-export-key-regexp end t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 (not (re-search-forward "^\\(inherit\\|feature\\)\\([ \t]\\|$\\)" end t)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 (defun eif-feature (&optional ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 "Return nil if definition is not found for optional FTR or feature declared at point."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 (interactive)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 (let ((class-deferred)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 (class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 (deferred-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 (ftr-def-class))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 (cond ((or ftr (and (eif-export-feature-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 (setq ftr (eif-to-feature-decl))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 (if (and (setq class-deferred (eif-get-class-name-from-source))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 (setq class (car class-deferred)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 deferred-p (cdr class-deferred)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 ftr-def-class (eif-find-ancestors-feature
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 (list class) deferred-p ftr)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 (cond ((equal (car ftr-def-class) class) t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 ((equal (cdr ftr-def-class) ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 ;; Feature inherited but not renamed.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 (message
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 "Feature '%s' of class '%s' inherited from class '%s'."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 ftr class (car ftr-def-class)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 ;; Feature inherited and renamed.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 (t (message "Feature '%s', class '%s' from feature '%s', class '%s'."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 ftr class (cdr ftr-def-class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 (car ftr-def-class))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 (beep)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 (message "(OO-Browser): '%s' feature not found." ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 ((and (not ftr) (eif-feature-def-p)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 ;; Later we might add the case of a feature invocation here.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 )))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 (defun eif-feature-def-p ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 "If point is within a feature definition's name, display feature including leading comments."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 (let ((opoint (point)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 (beginning-of-line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 (if (or (looking-at eif-routine-regexp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 (looking-at eif-attribute-regexp))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 (progn (setq opoint (match-beginning eif-feature-name-grpn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 (eif-to-comments-begin)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 (recenter 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 (goto-char opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 (goto-char opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 nil)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 (defun eif-feature-lessp (feature1 feature2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 (string-lessp (eif-feature-partial-name feature1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 (eif-feature-partial-name feature2)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
252 (defun eif-feature-map-tags (function regexp)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
253 "Apply FUNCTION to all current feature tags that match REGEXP and return a list of the results.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
254 Feature tags come from the file named by br-feature-tags-file."
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
255 (let ((identifier-chars (concat "[" eif-identifier-chars "]*"))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
256 (results))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
257 ;; Ensure match to feature names only; also handle "^" and "$" meta-chars
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
258 (setq regexp
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
259 (concat "^\\(" eif-identifier "\\)"
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
260 eif-type-tag-separator
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
261 br-feature-type-regexp " "
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
262 (if (equal (substring regexp 0 1) "^")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
263 (progn (setq regexp (substring regexp 1)) nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
264 identifier-chars)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
265 (if (equal (substring regexp -1) "$")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
266 (substring regexp 0 -1)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
267 (concat regexp identifier-chars))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
268 "[ \t\n\r\f]"))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
269 (save-excursion
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
270 (set-buffer (funcall br-find-file-noselect-function br-feature-tags-file))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
271 (goto-char 1)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
272 (while (re-search-forward regexp nil t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
273 (setq results (cons (funcall function) results))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
274 results))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
275
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
276 (defun eif-feature-matches (regexp)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
277 "Return an unsorted list of feature tags whose names match in part or whole to REGEXP.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
278 ^ and $ characters may be used to match to the beginning and end of a feature name,
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
279 respectively."
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
280 (eif-feature-map-tags
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
281 ;; Backward-char is necessary in this next function since point might have
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
282 ;; moved past a newline.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
283 (function (lambda () (backward-char) (br-feature-current)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
284 regexp))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
285
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 (defun eif-feature-partial-name (signature &optional with-class for-display)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 "Extract the feature name without its class name from feature SIGNATURE.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 If optional WITH-CLASS is non-nil, class name and 'eif-type-tag-separator'
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 are prepended to the name returned. If optional FOR-DISPLAY is non-nil, a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290 feature type character is prepended to the name for display in a browser
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 listing."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 (if (string-match (concat eif-type-tag-separator
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293 "\\(" br-feature-type-regexp " \\)")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 signature)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 (let ((class (substring signature 0 (match-beginning 0)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 (name (substring signature (match-end 0))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 (cond ((and with-class for-display)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 signature)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 (with-class
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 (concat class eif-type-tag-separator name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301 (for-display
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302 (substring signature (match-beginning 1)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 (t name)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 signature))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 (defun eif-feature-tag-class (element-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 "Extract the class name from ELEMENT-TAG."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 (if (string-match eif-type-tag-separator element-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 (substring element-tag 0 (match-beginning 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 (defun eif-find-ancestors-feature (class-list deferred-class ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 (let* ((classes class-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314 (cl)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 (file)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 (found-ftr))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 (if (null class-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 (while (and (not found-ftr) classes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 (setq cl (car classes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 file (br-class-path cl))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 (and file (setq found-ftr
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 (br-feature-found-p file ftr deferred-class)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 ;; If found-ftr is a cons cell, then only one parent class need
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 ;; be searched to look for ftr.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 (if (consp found-ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 (setq class-list (list (car found-ftr))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 ftr (cdr found-ftr)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 (setq classes (cdr classes)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330 (cond ((consp found-ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 (eif-find-ancestors-feature class-list deferred-class ftr))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 ((null found-ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333 (eif-find-ancestors-feature
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 (apply 'append (mapcar (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335 (lambda (cl) (br-get-parents cl)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336 class-list))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337 deferred-class
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 ftr))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339 (t (cons cl ftr))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 ;; Prefixed with 'eiffel' rather than 'eif' since works as a standalone
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 ;; feature in buffers whose major mode is 'eiffel-mode'. It is used by the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 ;; browser but may also be used standalone.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 (defun eif-find-class-name ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 "Return class name that point is within, else nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347 (if (= (point) (point-max)) (skip-chars-backward " \t\n"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 (skip-chars-forward " \t")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 (skip-chars-backward eif-identifier-chars)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 (skip-chars-backward " \t\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 (backward-char 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 (and (looking-at eif-class-name-pat)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 (eif-set-case
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 (buffer-substring (match-beginning 2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 (match-end 2))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 (defun eif-find-feature (feature-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 "With point selecting a class in a listing buffer, move point to definition of FEATURE-NAME in viewer window.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 Move point and return non-nil iff FEATURE-NAME is found."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 (interactive "sFeature to find: ")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 ;; If selected class is displayed, don't go to start of class
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 (if (equal (br-class-path (br-find-class-name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 (br-to-from-viewer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 (expand-file-name buffer-file-name)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 (br-edit))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 (if (eiffel-find-feature feature-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 (progn (recenter 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371 t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372 (br-to-from-viewer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373 (and (interactive-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 (beep)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376 (message "(OO-Browser): No '%s' feature found." feature-name)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 (defun eif-feature-locate-p (feature-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 (let (start class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380 (if (string-match (concat "\\`[^\]\[]+" eif-type-tag-separator)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 feature-tag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 ;; First move to the proper class implementation, so that if two
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383 ;; classes in the same file have the same feature signature, we still
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 ;; end up at the right one.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 (setq class (substring feature-tag 0 (1- (match-end 0))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387 (re-search-forward
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 (concat eif-class-name-before (regexp-quote class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 eif-class-name-after)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390 nil t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 (if (not (re-search-forward
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
392 (eif-feature-signature-to-regexp feature-tag) nil t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394 (setq start (match-beginning 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 (goto-char start)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
396 (skip-chars-forward " \t\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
397 (eif-to-comments-begin)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
398 (recenter 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
399 (goto-char start)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
400 t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
401
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
402 (defun eif-keyword-p ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
403 "Return t if point is within an Eiffel keyword, else nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
404 (if (= (point) (point-max)) (skip-chars-backward " \t\n"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
405 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
406 (skip-chars-forward " \t")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
407 (skip-chars-backward eif-identifier-chars)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
408 (and (looking-at eif-identifier)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
409 (br-member-sorted-strings (buffer-substring (match-beginning 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
410 (match-end 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
411 eif-reserved-words))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
412
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
413 (defun eif-locate-feature (ftr ftr-pat)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
414 (let ((opoint (point)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
415 (goto-char (point-min))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
416 (if (and (re-search-forward "^feature\\([ \t]\\|$\\)" nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
417 (re-search-forward ftr-pat nil t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
418 (progn (goto-char (match-beginning eif-feature-name-grpn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
419 (setq opoint (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
420 (eif-to-comments-begin)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
421 (recenter 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
422 (goto-char opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
423 t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
424 (goto-char opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
425 (and (interactive-p) (error (format "Feature '%s' not found."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
426 ftr))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
427
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
428 (defun eif-renamed-feature-p (ftr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
429 (goto-char (point-min))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
430 (let ((rename-regexp "[ \t\n]+rename[ \t\n]")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
431 (rename-match
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
432 (concat eif-identifier "[ \t\n]+as[ \t\n]+" ftr "[,; \t\n]"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
433 (prev-feature-nm)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
434 (prev-class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
435 (parents))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
436 (while (and (setq prev-feature-nm
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
437 (and (re-search-forward rename-regexp nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
438 (re-search-forward rename-match nil t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
439 (setq prev-feature-nm
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
440 (buffer-substring (match-beginning 1) (match-end 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
441 prev-class (match-beginning 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
442 (progn (backward-char 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
443 (eif-in-comment-p))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
444 (if prev-feature-nm
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
445 (progn (goto-char prev-class)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
446 (setq parents (eif-get-parents-from-source buffer-file-name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
447 (if (re-search-backward (concat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
448 "[^[][ \t\n]+\\("
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
449 (mapconcat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
450 (function (lambda (cl)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
451 (eif-set-case-type cl)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
452 parents
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
453 "\\|")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
454 "\\)")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
455 nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
456 (progn (setq prev-class (eif-set-case (buffer-substring
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
457 (match-beginning 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
458 (match-end 1))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
459 (cons prev-class prev-feature-nm))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
460 (beep)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
461 (message
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
462 "(OO-Browser): Internal error - no class associated with rename clause."))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
463
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
464 (defun eif-to-feature-decl ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
465 (let ((end))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
466 (while (and (progn (skip-chars-backward "^, \t\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
467 (and (not (= (preceding-char) ?,))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
468 (not (looking-at "export[ \t\n]+"))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
469 (progn (skip-chars-backward " \t\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
470 (setq end (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
471 (beginning-of-line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
472 (if (search-forward "--" end t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
473 (progn (goto-char end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
474 (skip-chars-forward " \t\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
475 nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
476 (goto-char end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
477 t)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
478 (if (looking-at "export[ \t\n]+")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
479 (goto-char (match-end 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
480 (skip-chars-forward " \t\n"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
481 (if (looking-at eif-feature-name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
482 (buffer-substring (match-beginning 0) (match-end 0))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
483
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
484
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
485 (defun eiffel-find-feature (feature-name)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
486 "Move point to start of feature named FEATURE-NAME in current buffer.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
487 Display feature including all preceding comments at the top of the window.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
488 Move point and return non-nil iff FEATURE-NAME is found."
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
489 (interactive "sFeature to find: ")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
490 (cond ((eif-locate-feature
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
491 feature-name (eif-routine-to-regexp feature-name)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
492 ((eif-to-attribute feature-name)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
493 (let ((opoint (point)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
494 (eif-to-comments-begin)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
495 (recenter 0)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
496 (goto-char opoint)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
497 (back-to-indentation)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
498 t))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
499
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
500 ;;; ************************************************************************
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
501 ;;; Private variables
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 0
diff changeset
502 ;;; ************************************************************************
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
503
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
504 (defconst eif-feature-name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
505 (concat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
506 "\\("
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
507 "\\(prefix[ \t]+\"\\(not\\|\\+\\|-\\)\"\\)"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
508 "\\|infix[ \t]+\"\\(div\\|mod\\|^\\|<=?\\|>=?\\|\+\\|-\\|\\*\\|/"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
509 "\\|and then\\|and\\|or else\\|or\\|xor\\|implies\\)"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
510 "\\|" eif-identifier "\\)")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
511 "Regexp matching any Eiffel feature name.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
512 Will also match class names and keywords, so tests for these should precede
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
513 use of this expression.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
514
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
515 (defconst eif-export-key-regexp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
516 "\\(^[ \t]*\\|[ \t]+\\)export[ \t\n]+"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
517 "Regexp matching the Eiffel export keyword in context.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
518
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
519 (defconst eif-class-repeat (concat "repeat[ \t]+" eif-identifier)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
520 "Match to an Eiffel 'repeat <class>' phrase. Grouping 1 is class name.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
521
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
522 (defconst eif-exported-feature
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
523 (concat "\\(,\\|export[ \t\n]+\\(--.*[ \t\n]+\\)*\\)"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
524 eif-feature-name "\\([ \t]*{[^}]+}\\)?"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
525 "\\([ \t]*[\n,]\\|[ \t]+--\\)")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
526 "Regexp to match to a feature declaration in an export clause.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
527 Exclude 'repeat <class>' phrases. Feature name is grouping 3.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
528
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
529
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
530 (provide 'br-eif-ft)