diff lisp/cedet/semantic/db-search.el @ 104420:2e15afd37998

cedet/semantic/adebug.el, cedet/semantic/chart.el, cedet/semantic/db-debug.el, cedet/semantic/db-ebrowse.el, cedet/semantic/db-el.el, cedet/semantic/db-file.el, cedet/semantic/db-javascript.el, cedet/semantic/db-search.el, cedet/semantic/db-typecache.el, cedet/semantic/dep.el, cedet/semantic/ia.el, cedet/semantic/tag-file.el, cedet/semantic/tag-ls.el: New files.
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 29 Aug 2009 19:32:33 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cedet/semantic/db-search.el	Sat Aug 29 19:32:33 2009 +0000
@@ -0,0 +1,451 @@
+;;; db-search.el --- Searching through semantic databases.
+
+;;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2008, 2009
+;;; Free Software Foundation, Inc.
+
+;; Author: Eric M. Ludlam <zappo@gnu.org>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; NOTE: THESE APIs ARE OBSOLETE:
+;;
+;; Databases of various forms can all be searched.  These routines
+;; cover many common forms of searching.
+;;
+;; There are three types of searches that can be implemented:
+;;
+;; Basic Search:
+;;  These searches allow searching on specific attributes of tags,
+;;  such as name or type.
+;;
+;; Advanced Search:
+;;  These are searches that were needed to accomplish some tasks
+;;  during in utilities.  Advanced searches include matching methods
+;;  defined outside some parent class.
+;;
+;;  The reason for advanced searches are so that external
+;;  repositories such as the Emacs obarray, or java .class files can
+;;  quickly answer these needed questions without dumping the entire
+;;  symbol list into Emacs for a regular semanticdb search.
+;;
+;; Generic Search:
+;;  The generic search, `semanticdb-find-nonterminal-by-function'
+;;  accepts a Emacs Lisp predicate that tests tags in Semantic
+;;  format.  Most external searches cannot perform this search.
+
+(require 'semantic/db)
+(require 'semantic/find)
+
+;;; Code:
+;;
+;;; Classes:
+
+;; @TODO MOVE THIS CLASS?
+(defclass semanticdb-search-results-table (semanticdb-abstract-table)
+  (
+   )
+  "Table used for search results when there is no file or table association.
+Examples include search results from external sources such as from
+Emacs' own symbol table, or from external libraries.")
+
+(defmethod semanticdb-refresh-table ((obj semanticdb-search-results-table) &optional force)
+  "If the tag list associated with OBJ is loaded, refresh it.
+This will call `semantic-fetch-tags' if that file is in memory."
+  nil)
+
+;;; Utils
+;;
+;; Convenience routines for searches
+(defun semanticdb-collect-find-results (result-in-databases
+					result-finding-function
+					ignore-system
+					find-file-on-match)
+  "OBSOLETE:
+Collect results across RESULT-IN-DATABASES for RESULT-FINDING-FUNCTION.
+If RESULT-IN-DATABASES is nil, search a range of associated databases
+calculated by `semanticdb-current-database-list'.
+RESULT-IN-DATABASES is a list of variable `semanticdb-project-database'
+objects.
+RESULT-FINDING-FUNCTION should accept one argument, the database being searched.
+Argument IGNORE-SYSTEM specifies if any available system databases should
+be ignored, or searched.
+Argument FIND-FILE-ON-MATCH indicates that the found databases
+should be capable of doing so."
+  (if (not (listp result-in-databases))
+      (signal 'wrong-type-argument (list 'listp result-in-databases)))
+  (let* ((semanticdb-search-system-databases
+	  (if ignore-system
+	      nil
+	    semanticdb-search-system-databases))
+	 (dbs (or result-in-databases
+		  ;; Calculate what database to use.
+		  ;; Something simple and dumb for now.
+		  (or (semanticdb-current-database-list)
+		      (list (semanticdb-current-database)))))
+	 (case-fold-search semantic-case-fold)
+	 (res (mapcar
+	       (lambda (db)
+		 (if (or (not find-file-on-match)
+			 (not (child-of-class-p
+			       (oref db new-table-class)
+			       semanticdb-search-results-table)))
+		     (funcall result-finding-function db)))
+	       dbs))
+	 out)
+    ;; Flatten the list.  The DB is unimportant at this stage.
+    (setq res (apply 'append res))
+    (setq out nil)
+    ;; Move across results, and throw out empties.
+    (while res
+      (if (car res)
+	  (setq out (cons (car res) out)))
+      (setq res (cdr res)))
+    ;; Results
+    out))
+
+;;; Programatic interfaces
+;;
+;; These routines all perform different types of searches, and are
+;; interfaces to the database methods used to also perform those searches.
+
+(defun semanticdb-find-nonterminal-by-token
+  (token &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all occurances of nonterminals with token TOKEN in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES, DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-token-method
+      db token search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+(make-obsolete 'semanticdb-find-nonterminal-by-token
+	       "Please don't use this function")
+
+(defun semanticdb-find-nonterminal-by-name
+  (name &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all occurances of nonterminals with name NAME in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES, DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-name-method
+      db name search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+(make-obsolete 'semanticdb-find-nonterminal-by-name
+	       "Please don't use this function")
+
+(defun semanticdb-find-nonterminal-by-name-regexp
+  (regex &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all occurances of nonterminals with name matching REGEX in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-name-regexp-method
+      db regex search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+(make-obsolete 'semanticdb-find-nonterminal-by-name-regexp
+	       "Please don't use this function")
+
+
+(defun semanticdb-find-nonterminal-by-type
+  (type &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all nonterminals with a type of TYPE in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-type-method
+      db type search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+(make-obsolete 'semanticdb-find-nonterminal-by-type
+	       "Please don't use this function")
+
+
+(defun semanticdb-find-nonterminal-by-property
+  (property value &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all nonterminals with a PROPERTY equal to VALUE in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-property-method
+      db property value search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+(make-obsolete 'semanticdb-find-nonterminal-by-property
+	       "Please don't use this function")
+
+(defun semanticdb-find-nonterminal-by-extra-spec
+  (spec &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all nonterminals with a SPEC in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-extra-spec-method
+      db spec search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+(make-obsolete 'semanticdb-find-nonterminal-by-extra-spec
+	       "Please don't use this function")
+
+(defun semanticdb-find-nonterminal-by-extra-spec-value
+  (spec value &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all nonterminals with a SPEC equal to VALUE in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-extra-spec-value-method
+      db spec value search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+(make-obsolete 'semanticdb-find-nonterminal-by-extra-spec-value
+	       "Please don't use this function")
+
+;;; Advanced Search Routines
+;;
+(defun semanticdb-find-nonterminal-external-children-of-type
+  (type &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all nonterminals which are child elements of TYPE.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-external-children-of-type-method
+      db type search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+
+;;; Generic Search routine
+;;
+
+(defun semanticdb-find-nonterminal-by-function
+  (function &optional databases search-parts search-includes diff-mode find-file-match ignore-system)
+  "OBSOLETE:
+Find all occurances of nonterminals which match FUNCTION.
+Search in all DATABASES.  If DATABASES is nil, search a range of
+associated databases calculated `semanticdb-current-database-list' and
+DATABASES is a list of variable `semanticdb-project-database' objects.
+When SEARCH-PARTS is non-nil the search will include children of tags.
+When SEARCH-INCLUDES is non-nil, the search will include dependency files.
+When DIFF-MODE is non-nil, search databases which are of a different mode.
+A Mode is the `major-mode' that file was in when it was last parsed.
+When FIND-FILE-MATCH is non-nil, the make sure any found token's file is
+in an Emacs buffer.
+When IGNORE-SYSTEM is non-nil, system libraries are not searched.
+Return a list ((DB-TABLE . TOKEN-OR-TOKEN-LIST) ...)."
+  (semanticdb-collect-find-results
+   databases
+   (lambda (db)
+     (semanticdb-find-nonterminal-by-function-method
+      db function search-parts search-includes diff-mode find-file-match))
+   ignore-system
+   find-file-match))
+
+;;; Search Methods
+;;
+;; These are the base routines for searching semantic databases.
+;; Overload these with your subclasses to participate in the searching
+;; mechanism.
+(defmethod semanticdb-find-nonterminal-by-token-method
+  ((database semanticdb-project-database) token search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+In DB, find all occurances of nonterminals with token TOKEN in databases.
+See `semanticdb-find-nonterminal-by-function-method' for details on,
+SEARCH-PARTS, SEARCH-INCLUDES, DIFF-MODE, and FIND-FILE-MATCH.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (let ((goofy-token-name token))
+    (semanticdb-find-nonterminal-by-function-method
+     database (lambda (stream sp si)
+		(semantic-brute-find-tag-by-class goofy-token-name stream sp si))
+     search-parts search-includes diff-mode find-file-match)))
+
+(defmethod semanticdb-find-nonterminal-by-name-method
+  ((database semanticdb-project-database) name search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+Find all occurances of nonterminals with name NAME in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES, DIFF-MODE, and FIND-FILE-MATCH.
+Return a list ((DB-TABLE . TOKEN) ...)."
+  (semanticdb-find-nonterminal-by-function-method
+   database
+   (lambda (stream sp si)
+     (semantic-brute-find-first-tag-by-name name stream sp si))
+   search-parts search-includes diff-mode find-file-match))
+
+(defmethod semanticdb-find-nonterminal-by-name-regexp-method
+  ((database semanticdb-project-database) regex search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+Find all occurances of nonterminals with name matching REGEX in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, and FIND-FILE-MATCH.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-find-nonterminal-by-function-method
+   database
+   (lambda (stream sp si)
+     (semantic-brute-find-tag-by-name-regexp regex stream sp si))
+   search-parts search-includes diff-mode find-file-match))
+
+(defmethod semanticdb-find-nonterminal-by-type-method
+  ((database semanticdb-project-database) type search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+Find all nonterminals with a type of TYPE in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, and FIND-FILE-MATCH.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-find-nonterminal-by-function-method
+   database
+   (lambda (stream sp si)
+     (semantic-brute-find-tag-by-type type stream sp si))
+   search-parts search-includes diff-mode find-file-match))
+
+(defmethod semanticdb-find-nonterminal-by-property-method
+  ((database semanticdb-project-database) property value search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+Find all nonterminals with a PROPERTY equal to VALUE in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, and FIND-FILE-MATCH.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-find-nonterminal-by-function-method
+   database
+   (lambda (stream sp si)
+     (semantic-brute-find-tag-by-property property value stream sp si))
+   search-parts search-includes diff-mode find-file-match))
+
+(defmethod semanticdb-find-nonterminal-by-extra-spec-method
+  ((database semanticdb-project-database) spec search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+Find all nonterminals with a SPEC in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, and FIND-FILE-MATCH.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-find-nonterminal-by-function-method
+   database
+   (lambda (stream sp si)
+     (semantic-brute-find-tag-by-attribute spec stream sp si))
+   search-parts search-includes diff-mode find-file-match))
+
+(defmethod semanticdb-find-nonterminal-by-extra-spec-value-method
+  ((database semanticdb-project-database) spec value search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+Find all nonterminals with a SPEC equal to VALUE in databases.
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, and FIND-FILE-MATCH.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-find-nonterminal-by-function-method
+   database
+   (lambda (stream sp si)
+     (semantic-brute-find-tag-by-attribute-value spec value stream sp si))
+   search-parts search-includes diff-mode find-file-match))
+
+;;; Advanced Searches
+;;
+(defmethod semanticdb-find-nonterminal-external-children-of-type-method
+  ((database semanticdb-project-database) type search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+Find all nonterminals which are child elements of TYPE
+See `semanticdb-find-nonterminal-by-function' for details on DATABASES,
+SEARCH-PARTS, SEARCH-INCLUDES DIFF-MODE, FIND-FILE-MATCH and IGNORE-SYSTEM.
+Return a list ((DB-TABLE . TOKEN-LIST) ...)."
+  (semanticdb-find-nonterminal-by-function-method
+   database
+   `(lambda (stream sp si)
+      (semantic-brute-find-tag-by-function
+       (lambda (tok)
+	 (let ((p (semantic-nonterminal-external-member-parent tok)))
+	   (and (stringp p) (string= ,type p)))
+	 )
+       stream sp si))
+   nil nil t))
+
+;;; Generic Search
+;;
+(defmethod semanticdb-find-nonterminal-by-function-method
+  ((database semanticdb-project-database)
+   function &optional search-parts search-includes diff-mode find-file-match)
+  "OBSOLETE:
+In DATABASE, find all occurances of nonterminals which match FUNCTION.
+When SEARCH-PARTS is non-nil the search will include children of tags.
+When SEARCH-INCLUDES is non-nil, the search will include dependency files.
+When DIFF-MODE is non-nil, search databases which are of a different mode.
+A mode is the `major-mode' that file was in when it was last parsed.
+When FIND-FILE-MATCH is non-nil, the make sure any found token's file is
+in an Emacs buffer.
+Return a list of matches."
+  (let* ((ret nil)
+	 (files (semanticdb-get-database-tables database))
+	 (found nil)
+	 (orig-buffer (current-buffer)))
+    (while files
+      (when (or diff-mode
+		(semanticdb-equivalent-mode (car files) orig-buffer))
+	;; This can cause unneeded refreshes while typing with
+	;; senator-eldoc mode.
+	;;(semanticdb-refresh-table (car files))
+	(setq found (funcall function
+			     (semanticdb-get-tags (car files))
+			     search-parts
+			     search-includes
+			     )))
+      (if found
+	  (progn
+	    ;; When something is found, make sure we read in that buffer if it
+	    ;; had not already been loaded.
+	    (if find-file-match
+		(save-excursion (semanticdb-set-buffer (car files))))
+	    ;; In theory, the database is up-to-date with what is in the file, and
+	    ;; these tags are ready to go.
+	    ;; There is a bug lurking here I don't have time to fix.
+	    (setq ret (cons (cons (car files) found) ret))
+	    (setq found nil)))
+      (setq files (cdr files)))
+    (nreverse ret)))
+
+(provide 'semantic/db-search)
+
+;;; semanticdb-search.el ends here