1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-02 13:41:30 -08:00

* lisp/cedet/semantic: Silence some warnings

* lisp/cedet/semantic/db-el.el (emacs-lisp-mode)
(semanticdb-get-database-tables): Use make-instance to silence warnings.

* lisp/cedet/semantic/symref.el: Require semantic/find since we use
some macros from there.  Silence compilation warnings:
Replace initargs with slot names in oref/oset.
Move `SYMREF TOOLS' section earlier so definitions precede their use.
This commit is contained in:
Stefan Monnier 2016-05-12 13:08:34 -04:00
parent 73071b4cdb
commit 28e8e49e08
2 changed files with 93 additions and 92 deletions

View file

@ -79,7 +79,7 @@ Adds the number of tags in this file to the object print name."
;; Create the database, and add it to searchable databases for Emacs Lisp mode.
(defvar-mode-local emacs-lisp-mode semanticdb-project-system-databases
(list
(semanticdb-project-database-emacs-lisp "Emacs"))
(make-instance 'semanticdb-project-database-emacs-lisp))
"Search Emacs core for symbols.")
(defvar-mode-local emacs-lisp-mode semanticdb-find-default-throttle
@ -96,7 +96,7 @@ Create one of our special tables that can act as an intermediary."
;; We need to return something since there is always the "master table"
;; The table can then answer file name type questions.
(when (not (slot-boundp obj 'tables))
(let ((newtable (semanticdb-table-emacs-lisp "Emacs System Table")))
(let ((newtable (make-instance 'semanticdb-table-emacs-lisp)))
(oset obj tables (list newtable))
(oset newtable parent-db obj)
(oset newtable tags nil)

View file

@ -65,6 +65,8 @@
;; Your tool should then create an instance of `semantic-symref-result'.
(require 'semantic)
(eval-when-compile (require 'semantic/find)) ;For semantic-find-tags-*
(eval-when-compile (require 'ede/proj)) ;For `metasubproject' warning.
(defvar ede-minor-mode)
(declare-function data-debug-new-buffer "data-debug")
@ -109,7 +111,7 @@ Start with an EDE project, or use the default directory."
default-directory)))
(if (and rootproj (condition-case nil
;; Hack for subprojects.
(oref rootproj :metasubproject)
(oref rootproj metasubproject)
(error nil)))
(ede-up-directory rootdirbase)
rootdirbase)))
@ -284,6 +286,80 @@ Returns an object of class `semantic-symref-result'."
(semantic-symref-data-debug-last-result))))
)
;;; SYMREF TOOLS
;;
;; The base symref tool provides something to hang new tools off of
;; for finding symbol references.
(defclass semantic-symref-tool-baseclass ()
((searchfor :initarg :searchfor
:type string
:documentation "The thing to search for.")
(searchtype :initarg :searchtype
:type symbol
:documentation "The type of search to do.
Values could be 'symbol, 'regexp, 'tagname, or 'completion.")
(searchscope :initarg :searchscope
:type symbol
:documentation
"The scope to search for.
Can be 'project, 'target, or 'file.")
(resulttype :initarg :resulttype
:type symbol
:documentation
"The kind of search results desired.
Can be 'line, 'file, or 'tag.
The type of result can be converted from 'line to 'file, or 'line to 'tag,
but not from 'file to 'line or 'tag.")
)
"Baseclass for all symbol references tools.
A symbol reference tool supplies functionality to identify the locations of
where different symbols are used.
Subclasses should be named `semantic-symref-tool-NAME', where
NAME is the name of the tool used in the configuration variable
`semantic-symref-tool'"
:abstract t)
(cl-defmethod semantic-symref-get-result ((tool semantic-symref-tool-baseclass))
"Calculate the results of a search based on TOOL.
The symref TOOL should already contain the search criteria."
(let ((answer (semantic-symref-perform-search tool))
)
(when answer
(let ((answersym (if (eq (oref tool resulttype) 'file)
:hit-files
(if (stringp (car answer))
:hit-text
:hit-lines))))
(semantic-symref-result (oref tool searchfor)
answersym
answer
:created-by tool))
)
))
(cl-defmethod semantic-symref-perform-search ((tool semantic-symref-tool-baseclass))
"Base search for symref tools should throw an error."
(error "Symref tool objects must implement `semantic-symref-perform-search'"))
(cl-defmethod semantic-symref-parse-tool-output ((tool semantic-symref-tool-baseclass)
outputbuffer)
"Parse the entire OUTPUTBUFFER of a symref tool.
Calls the method `semantic-symref-parse-tool-output-one-line' over and
over until it returns nil."
(with-current-buffer outputbuffer
(goto-char (point-min))
(let ((result nil)
(hit nil))
(while (setq hit (semantic-symref-parse-tool-output-one-line tool))
(setq result (cons hit result)))
(nreverse result)))
)
(cl-defmethod semantic-symref-parse-tool-output-one-line ((tool semantic-symref-tool-baseclass))
"Base tool output parser is not implemented."
(error "Symref tool objects must implement `semantic-symref-parse-tool-output-one-line'"))
;;; RESULTS
;;
;; The results class and methods provide features for accessing hits.
@ -316,9 +392,9 @@ Use the `semantic-symref-hit-tags' method to get this list.")
(cl-defmethod semantic-symref-result-get-files ((result semantic-symref-result))
"Get the list of files from the symref result RESULT."
(if (slot-boundp result :hit-files)
(if (slot-boundp result 'hit-files)
(oref result hit-files)
(let* ((lines (oref result :hit-lines))
(let* ((lines (oref result hit-lines))
(files (mapcar (lambda (a) (cdr a)) lines))
(ans nil))
(setq ans (list (car files))
@ -359,12 +435,12 @@ Optional OPEN-BUFFERS indicates that the buffers that the hits are
in should remain open after scanning.
Note: This can be quite slow if most of the hits are not in buffers
already."
(if (and (slot-boundp result :hit-tags) (oref result hit-tags))
(if (and (slot-boundp result 'hit-tags) (oref result hit-tags))
(oref result hit-tags)
;; Calculate the tags.
(let ((lines (oref result :hit-lines))
(txt (oref (oref result :created-by) :searchfor))
(searchtype (oref (oref result :created-by) :searchtype))
(let ((lines (oref result hit-lines))
(txt (oref (oref result created-by) searchfor))
(searchtype (oref (oref result created-by) searchtype))
(ans nil)
(out nil))
(save-excursion
@ -390,7 +466,7 @@ already."
(semantic--tag-put-property (car out) :hit lines)))
))
;; Out is reversed... twice
(oset result :hit-tags (nreverse out)))))
(oset result hit-tags (nreverse out)))))
(defun semantic-symref-hit-to-tag-via-db (hit searchtxt searchtype)
"Convert the symref HIT into a TAG by looking up the tag via a database.
@ -407,16 +483,15 @@ If there is no database, of if the searchtype is wrong, return nil."
(file (cdr hit))
;; FAIL here vv - don't load is not obeyed if no table found.
(db (semanticdb-file-table-object file t))
(found nil)
(found
(cond ((eq searchtype 'tagname)
(semantic-find-tags-by-name searchtxt db))
((eq searchtype 'tagregexp)
(semantic-find-tags-by-name-regexp searchtxt db))
((eq searchtype 'tagcompletions)
(semantic-find-tags-for-completion searchtxt db))))
(hit nil)
)
(cond ((eq searchtype 'tagname)
(setq found (semantic-find-tags-by-name searchtxt db)))
((eq searchtype 'tagregexp)
(setq found (semantic-find-tags-by-name-regexp searchtxt db)))
((eq searchtype 'tagcompletions)
(setq found (semantic-find-tags-for-completion searchtxt db)))
)
;; Loop over FOUND to see if we can line up a match with a line number.
(when (= (length found) 1)
(setq hit (car found)))
@ -501,80 +576,6 @@ buffers that were opened."
(semantic--tag-put-property tag :hit (list line)))
tag))
;;; SYMREF TOOLS
;;
;; The base symref tool provides something to hang new tools off of
;; for finding symbol references.
(defclass semantic-symref-tool-baseclass ()
((searchfor :initarg :searchfor
:type string
:documentation "The thing to search for.")
(searchtype :initarg :searchtype
:type symbol
:documentation "The type of search to do.
Values could be 'symbol, 'regexp, 'tagname, or 'completion.")
(searchscope :initarg :searchscope
:type symbol
:documentation
"The scope to search for.
Can be 'project, 'target, or 'file.")
(resulttype :initarg :resulttype
:type symbol
:documentation
"The kind of search results desired.
Can be 'line, 'file, or 'tag.
The type of result can be converted from 'line to 'file, or 'line to 'tag,
but not from 'file to 'line or 'tag.")
)
"Baseclass for all symbol references tools.
A symbol reference tool supplies functionality to identify the locations of
where different symbols are used.
Subclasses should be named `semantic-symref-tool-NAME', where
NAME is the name of the tool used in the configuration variable
`semantic-symref-tool'"
:abstract t)
(cl-defmethod semantic-symref-get-result ((tool semantic-symref-tool-baseclass))
"Calculate the results of a search based on TOOL.
The symref TOOL should already contain the search criteria."
(let ((answer (semantic-symref-perform-search tool))
)
(when answer
(let ((answersym (if (eq (oref tool :resulttype) 'file)
:hit-files
(if (stringp (car answer))
:hit-text
:hit-lines))))
(semantic-symref-result (oref tool searchfor)
answersym
answer
:created-by tool))
)
))
(cl-defmethod semantic-symref-perform-search ((tool semantic-symref-tool-baseclass))
"Base search for symref tools should throw an error."
(error "Symref tool objects must implement `semantic-symref-perform-search'"))
(cl-defmethod semantic-symref-parse-tool-output ((tool semantic-symref-tool-baseclass)
outputbuffer)
"Parse the entire OUTPUTBUFFER of a symref tool.
Calls the method `semantic-symref-parse-tool-output-one-line' over and
over until it returns nil."
(with-current-buffer outputbuffer
(goto-char (point-min))
(let ((result nil)
(hit nil))
(while (setq hit (semantic-symref-parse-tool-output-one-line tool))
(setq result (cons hit result)))
(nreverse result)))
)
(cl-defmethod semantic-symref-parse-tool-output-one-line ((tool semantic-symref-tool-baseclass))
"Base tool output parser is not implemented."
(error "Symref tool objects must implement `semantic-symref-parse-tool-output-one-line'"))
(provide 'semantic/symref)
;; Local variables: