Commit | Line | Data |
---|---|---|
a4bdf715 CY |
1 | ;;; semantic/symref/cscope.el --- Semantic-symref support via cscope. |
2 | ||
3 | ;;; Copyright (C) 2009 Free Software Foundation, Inc. | |
4 | ||
5 | ;; Author: Eric M. Ludlam <eric@siege-engine.com> | |
6 | ||
7 | ;; This file is part of GNU Emacs. | |
8 | ||
9 | ;; GNU Emacs is free software: you can redistribute it and/or modify | |
10 | ;; it under the terms of the GNU General Public License as published by | |
11 | ;; the Free Software Foundation, either version 3 of the License, or | |
12 | ;; (at your option) any later version. | |
13 | ||
14 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
15 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | ;; GNU General Public License for more details. | |
18 | ||
19 | ;; You should have received a copy of the GNU General Public License | |
20 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | |
21 | ||
22 | ;;; Commentary: | |
23 | ;; | |
24 | ;; Semantic symref support via cscope. | |
25 | ||
26 | (require 'cedet-cscope) | |
27 | (require 'semantic/symref) | |
28 | ||
1fe1547a CY |
29 | (defvar ede-minor-mode) |
30 | (declare-function ede-toplevel "ede/files") | |
31 | (declare-function ede-project-root-directory "ede/files") | |
32 | ||
a4bdf715 CY |
33 | ;;; Code: |
34 | (defclass semantic-symref-tool-cscope (semantic-symref-tool-baseclass) | |
35 | ( | |
36 | ) | |
37 | "A symref tool implementation using CScope. | |
38 | The CScope command can be used to generate lists of tags in a way | |
39 | similar to that of `grep'. This tool will parse the output to generate | |
40 | the hit list. | |
41 | ||
42 | See the function `cedet-cscope-search' for more details.") | |
43 | ||
44 | (defmethod semantic-symref-perform-search ((tool semantic-symref-tool-cscope)) | |
45 | "Perform a search with GNU Global." | |
46 | (let* ((rootproj (when (and (featurep 'ede) ede-minor-mode) | |
47 | (ede-toplevel))) | |
48 | (default-directory (if rootproj | |
49 | (ede-project-root-directory rootproj) | |
50 | default-directory)) | |
51 | ;; CScope has to be run from the project root where | |
52 | ;; cscope.out is. | |
53 | (b (cedet-cscope-search (oref tool :searchfor) | |
54 | (oref tool :searchtype) | |
55 | (oref tool :resulttype) | |
56 | (oref tool :searchscope) | |
57 | )) | |
58 | ) | |
59 | (semantic-symref-parse-tool-output tool b) | |
60 | )) | |
61 | ||
62 | (defmethod semantic-symref-parse-tool-output-one-line ((tool semantic-symref-tool-cscope)) | |
63 | "Parse one line of grep output, and return it as a match list. | |
64 | Moves cursor to end of the match." | |
65 | (cond ((eq (oref tool :resulttype) 'file) | |
66 | ;; Search for files | |
67 | (when (re-search-forward "^\\([^\n]+\\)$" nil t) | |
68 | (match-string 1))) | |
69 | ((eq (oref tool :searchtype) 'tagcompletions) | |
70 | ;; Search for files | |
71 | (when (re-search-forward "^[^ ]+ [^ ]+ [^ ]+ \\(.*\\)$" nil t) | |
72 | (let ((subtxt (match-string 1)) | |
73 | (searchtxt (oref tool :searchfor))) | |
74 | (if (string-match (concat "\\<" searchtxt "\\(\\w\\|\\s_\\)*\\>") | |
75 | subtxt) | |
76 | (match-string 0 subtxt) | |
77 | ;; We have to return something at this point. | |
78 | subtxt))) | |
79 | ) | |
80 | (t | |
81 | (when (re-search-forward "^\\([^ ]+\\) [^ ]+ \\([0-9]+\\) " nil t) | |
82 | (cons (string-to-number (match-string 2)) | |
83 | (expand-file-name (match-string 1))) | |
84 | )))) | |
85 | ||
86 | (provide 'semantic/symref/cscope) | |
87 | ||
88 | ;;; semantic/symref/cscope.el ends here |