Mercurial > emacs
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