Mercurial > emacs
comparison lisp/cedet/semantic/db-javascript.el @ 105260:bbd7017a25d9
CEDET (development tools) package merged.
* cedet/*.el:
* cedet/ede/*.el:
* cedet/semantic/*.el:
* cedet/srecode/*.el: New files.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Mon, 28 Sep 2009 15:15:00 +0000 |
parents | 6ccad1511df1 |
children | 108a3a6d8be0 |
comparison
equal
deleted
inserted
replaced
105259:5707f7454ab5 | 105260:bbd7017a25d9 |
---|---|
1 ;;; semantic/db-javascript.el --- Semantic database extensions for javascript | |
2 | |
3 ;;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 | |
4 ;;; Free Software Foundation, Inc. | |
5 | |
6 ;; Author: Joakim Verona | |
7 | |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs is free software: you can redistribute it and/or modify | |
11 ;; it under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation, either version 3 of the License, or | |
13 ;; (at your option) any later version. | |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | |
22 | |
23 ;;; Commentary: | |
24 ;; | |
25 ;; Semanticdb database for Javascript. | |
26 ;; | |
27 ;; This is an omniscient database with a hard-coded list of symbols for | |
28 ;; Javascript. See the doc at the end of this file for adding or modifying | |
29 ;; the list of tags. | |
30 ;; | |
31 | |
32 (require 'semantic/db) | |
33 (require 'semantic/db-find) | |
34 | |
35 (eval-when-compile | |
36 ;; For generic function searching. | |
37 (require 'eieio) | |
38 (require 'eieio-opt)) | |
39 | |
40 ;;; Code: | |
41 (defvar semanticdb-javascript-tags | |
42 '(("eval" function | |
43 (:arguments | |
44 (("x" variable nil nil nil))) | |
45 nil nil) | |
46 ("parseInt" function | |
47 (:arguments | |
48 (("string" variable nil nil nil) | |
49 ("radix" variable nil nil nil))) | |
50 nil nil) | |
51 ("parseFloat" function | |
52 (:arguments | |
53 (("string" variable nil nil nil))) | |
54 nil nil) | |
55 ("isNaN" function | |
56 (:arguments | |
57 (("number" variable nil nil nil))) | |
58 nil nil) | |
59 ("isFinite" function | |
60 (:arguments | |
61 (("number" variable nil nil nil))) | |
62 nil nil) | |
63 ("decodeURI" function | |
64 (:arguments | |
65 (("encodedURI" variable nil nil nil))) | |
66 nil nil) | |
67 ("decodeURIComponent" function | |
68 (:arguments | |
69 (("encodedURIComponent" variable nil nil nil))) | |
70 nil nil) | |
71 ("encodeURI" function | |
72 (:arguments | |
73 (("uri" variable nil nil nil))) | |
74 nil nil) | |
75 ("encodeURIComponent" function | |
76 (:arguments | |
77 (("uriComponent" variable nil nil nil))) | |
78 nil nil)) | |
79 "Hard-coded list of javascript tags for semanticdb. | |
80 See bottom of this file for instruction on managing this list.") | |
81 | |
82 ;;; Classes: | |
83 (defclass semanticdb-table-javascript (semanticdb-search-results-table) | |
84 ((major-mode :initform javascript-mode) | |
85 ) | |
86 "A table for returning search results from javascript.") | |
87 | |
88 (defclass semanticdb-project-database-javascript | |
89 (semanticdb-project-database | |
90 eieio-singleton ;this db is for js globals, so singleton is apropriate | |
91 ) | |
92 ((new-table-class :initform semanticdb-table-javascript | |
93 :type class | |
94 :documentation | |
95 "New tables created for this database are of this class.") | |
96 ) | |
97 "Database representing javascript.") | |
98 | |
99 ;; Create the database, and add it to searchable databases for javascript mode. | |
100 (defvar-mode-local javascript-mode semanticdb-project-system-databases | |
101 (list | |
102 (semanticdb-project-database-javascript "Javascript")) | |
103 "Search javascript for symbols.") | |
104 | |
105 ;; NOTE: Be sure to modify this to the best advantage of your | |
106 ;; language. | |
107 (defvar-mode-local javascript-mode semanticdb-find-default-throttle | |
108 '(project omniscience) | |
109 "Search project files, then search this omniscience database. | |
110 It is not necessary to to system or recursive searching because of | |
111 the omniscience database.") | |
112 | |
113 ;;; Filename based methods | |
114 ;; | |
115 (defmethod semanticdb-get-database-tables ((obj semanticdb-project-database-javascript)) | |
116 "For a javascript database, there are no explicit tables. | |
117 Create one of our special tables that can act as an intermediary." | |
118 ;; NOTE: This method overrides an accessor for the `tables' slot in | |
119 ;; a database. You can either construct your own (like tmp here | |
120 ;; or you can manage any number of tables. | |
121 | |
122 ;; We need to return something since there is always the "master table" | |
123 ;; The table can then answer file name type questions. | |
124 (when (not (slot-boundp obj 'tables)) | |
125 (let ((newtable (semanticdb-table-javascript "tmp"))) | |
126 (oset obj tables (list newtable)) | |
127 (oset newtable parent-db obj) | |
128 (oset newtable tags nil) | |
129 )) | |
130 (call-next-method) | |
131 ) | |
132 | |
133 (defmethod semanticdb-file-table ((obj semanticdb-project-database-javascript) filename) | |
134 "From OBJ, return FILENAME's associated table object." | |
135 ;; NOTE: See not for `semanticdb-get-database-tables'. | |
136 (car (semanticdb-get-database-tables obj)) | |
137 ) | |
138 | |
139 (defmethod semanticdb-get-tags ((table semanticdb-table-javascript )) | |
140 "Return the list of tags belonging to TABLE." | |
141 ;; NOTE: Omniscient databases probably don't want to keep large tabes | |
142 ;; lolly-gagging about. Keep internal Emacs tables empty and | |
143 ;; refer to alternate databases when you need something. | |
144 semanticdb-javascript-tags) | |
145 | |
146 (defmethod semanticdb-equivalent-mode ((table semanticdb-table-javascript) &optional buffer) | |
147 "Return non-nil if TABLE's mode is equivalent to BUFFER. | |
148 Equivalent modes are specified by by `semantic-equivalent-major-modes' | |
149 local variable." | |
150 (save-excursion | |
151 (set-buffer buffer) | |
152 (eq (or mode-local-active-mode major-mode) 'javascript-mode))) | |
153 | |
154 ;;; Usage | |
155 ;; | |
156 ;; Unlike other tables, an omniscent database does not need to | |
157 ;; be associated with a path. Use this routine to always add ourselves | |
158 ;; to a search list. | |
159 (define-mode-local-override semanticdb-find-translate-path javascript-mode | |
160 (path brutish) | |
161 "Return a list of semanticdb tables asociated with PATH. | |
162 If brutish, do the default action. | |
163 If not brutish, do the default action, and append the system | |
164 database (if available.)" | |
165 (let ((default | |
166 ;; When we recurse, disable searching of system databases | |
167 ;; so that our Javascript database only shows up once when | |
168 ;; we append it in this iteration. | |
169 (let ((semanticdb-search-system-databases nil) | |
170 ) | |
171 (semanticdb-find-translate-path-default path brutish)))) | |
172 ;; Don't add anything if BRUTISH is on (it will be added in that fcn) | |
173 ;; or if we aren't supposed to search the system. | |
174 (if (or brutish (not semanticdb-search-system-databases)) | |
175 default | |
176 (let ((tables (apply #'append | |
177 (mapcar | |
178 (lambda (db) (semanticdb-get-database-tables db)) | |
179 semanticdb-project-system-databases)))) | |
180 (append default tables))))) | |
181 | |
182 ;;; Search Overrides | |
183 ;; | |
184 ;; NOTE WHEN IMPLEMENTING: Be sure to add doc-string updates explaining | |
185 ;; how your new search routines are implemented. | |
186 ;; | |
187 (defun semanticdb-javascript-regexp-search (regexp) | |
188 "Search for REGEXP in our fixed list of javascript tags." | |
189 (let* ((tags semanticdb-javascript-tags) | |
190 (result nil)) | |
191 (while tags | |
192 (if (string-match regexp (caar tags)) | |
193 (setq result (cons (car tags) result))) | |
194 (setq tags (cdr tags))) | |
195 result)) | |
196 | |
197 (defmethod semanticdb-find-tags-by-name-method | |
198 ((table semanticdb-table-javascript) name &optional tags) | |
199 "Find all tags named NAME in TABLE. | |
200 Return a list of tags." | |
201 (if tags | |
202 ;; If TAGS are passed in, then we don't need to do work here. | |
203 (call-next-method) | |
204 (assoc-string name semanticdb-javascript-tags) | |
205 )) | |
206 | |
207 (defmethod semanticdb-find-tags-by-name-regexp-method | |
208 ((table semanticdb-table-javascript) regex &optional tags) | |
209 "Find all tags with name matching REGEX in TABLE. | |
210 Optional argument TAGS is a list of tags to search. | |
211 Return a list of tags." | |
212 (if tags (call-next-method) | |
213 ;; YOUR IMPLEMENTATION HERE | |
214 (semanticdb-javascript-regexp-search regex) | |
215 | |
216 )) | |
217 | |
218 (defmethod semanticdb-find-tags-for-completion-method | |
219 ((table semanticdb-table-javascript) prefix &optional tags) | |
220 "In TABLE, find all occurances of tags matching PREFIX. | |
221 Optional argument TAGS is a list of tags to search. | |
222 Returns a table of all matching tags." | |
223 (if tags (call-next-method) | |
224 ;; YOUR IMPLEMENTATION HERE | |
225 (semanticdb-javascript-regexp-search (concat "^" prefix ".*")) | |
226 )) | |
227 | |
228 (defmethod semanticdb-find-tags-by-class-method | |
229 ((table semanticdb-table-javascript) class &optional tags) | |
230 "In TABLE, find all occurances of tags of CLASS. | |
231 Optional argument TAGS is a list of tags to search. | |
232 Returns a table of all matching tags." | |
233 (if tags (call-next-method) | |
234 ;; YOUR IMPLEMENTATION HERE | |
235 ;; | |
236 ;; Note: This search method could be considered optional in an | |
237 ;; omniscient database. It may be unwise to return all tags | |
238 ;; that exist for a language that are a variable or function. | |
239 ;; | |
240 ;; If it is optional, you can just delete this method. | |
241 nil)) | |
242 | |
243 ;;; Deep Searches | |
244 ;; | |
245 ;; If your language does not have a `deep' concept, these can be left | |
246 ;; alone, otherwise replace with implementations similar to those | |
247 ;; above. | |
248 ;; | |
249 (defmethod semanticdb-deep-find-tags-by-name-method | |
250 ((table semanticdb-table-javascript) name &optional tags) | |
251 "Find all tags name NAME in TABLE. | |
252 Optional argument TAGS is a list of tags t | |
253 Like `semanticdb-find-tags-by-name-method' for javascript." | |
254 (semanticdb-find-tags-by-name-method table name tags)) | |
255 | |
256 (defmethod semanticdb-deep-find-tags-by-name-regexp-method | |
257 ((table semanticdb-table-javascript) regex &optional tags) | |
258 "Find all tags with name matching REGEX in TABLE. | |
259 Optional argument TAGS is a list of tags to search. | |
260 Like `semanticdb-find-tags-by-name-method' for javascript." | |
261 (semanticdb-find-tags-by-name-regexp-method table regex tags)) | |
262 | |
263 (defmethod semanticdb-deep-find-tags-for-completion-method | |
264 ((table semanticdb-table-javascript) prefix &optional tags) | |
265 "In TABLE, find all occurances of tags matching PREFIX. | |
266 Optional argument TAGS is a list of tags to search. | |
267 Like `semanticdb-find-tags-for-completion-method' for javascript." | |
268 (semanticdb-find-tags-for-completion-method table prefix tags)) | |
269 | |
270 ;;; Advanced Searches | |
271 ;; | |
272 (defmethod semanticdb-find-tags-external-children-of-type-method | |
273 ((table semanticdb-table-javascript) type &optional tags) | |
274 "Find all nonterminals which are child elements of TYPE | |
275 Optional argument TAGS is a list of tags to search. | |
276 Return a list of tags." | |
277 (if tags (call-next-method) | |
278 ;; YOUR IMPLEMENTATION HERE | |
279 ;; | |
280 ;; OPTIONAL: This could be considered an optional function. It is | |
281 ;; used for `semantic-adopt-external-members' and may not | |
282 ;; be possible to do in your language. | |
283 ;; | |
284 ;; If it is optional, you can just delete this method. | |
285 )) | |
286 | |
287 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
288 (defun semanticdb-javascript-strip-tags (tags) | |
289 "Strip TAGS from overlays and reparse symbols." | |
290 (cond ((and (consp tags) (eq 'reparse-symbol (car tags))) | |
291 nil) | |
292 ((overlayp tags) nil) | |
293 ((atom tags) tags) | |
294 (t (cons (semanticdb-javascript-strip-tags | |
295 (car tags)) (semanticdb-javascript-strip-tags | |
296 (cdr tags)))))) | |
297 | |
298 ;this list was made from a javascript file, and the above function | |
299 ;; function eval(x){} | |
300 ;; function parseInt(string,radix){} | |
301 ;; function parseFloat(string){} | |
302 ;; function isNaN(number){} | |
303 ;; function isFinite(number){} | |
304 ;; function decodeURI(encodedURI){} | |
305 ;; function decodeURIComponent (encodedURIComponent){} | |
306 ;; function encodeURI (uri){} | |
307 ;; function encodeURIComponent (uriComponent){} | |
308 | |
309 (provide 'semantic/db-javascript) | |
310 | |
311 ;;; semantic/db-javascript.el ends here |