diff options
| author | Chong Yidong | 2009-09-20 21:06:41 +0000 |
|---|---|---|
| committer | Chong Yidong | 2009-09-20 21:06:41 +0000 |
| commit | 4d902e6f13f6bf5d304a0cbcff33e2780a825206 (patch) | |
| tree | 20c5dbf4febbaff55e22b4fa0e950cf552e88e70 /lisp/cedet/srecode/cpp.el | |
| parent | 70702e9b0ea781fb955c66320c935bc0a8e1d0f1 (diff) | |
| download | emacs-4d902e6f13f6bf5d304a0cbcff33e2780a825206.tar.gz emacs-4d902e6f13f6bf5d304a0cbcff33e2780a825206.zip | |
lisp/cedet/srecode.el:
lisp/cedet/srecode/*.el:
test/cedet/srecode-tests.el: New files
lisp/files.el (auto-mode-alist): Use srecode-template-mode for .srt files.
lisp/cedet/semantic/bovine/scm.el: Add local vars section for autoloading.
Diffstat (limited to 'lisp/cedet/srecode/cpp.el')
| -rw-r--r-- | lisp/cedet/srecode/cpp.el | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/lisp/cedet/srecode/cpp.el b/lisp/cedet/srecode/cpp.el new file mode 100644 index 00000000000..28613a004ed --- /dev/null +++ b/lisp/cedet/srecode/cpp.el | |||
| @@ -0,0 +1,149 @@ | |||
| 1 | ;;; srecode/cpp.el --- C++ specific handlers for Semantic Recoder | ||
| 2 | |||
| 3 | ;; Copyright (C) 2007, 2009 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; Author: Eric M. Ludlam <eric@siege-engine.com> | ||
| 6 | ;; Jan Moringen <scymtym@users.sourceforge.net> | ||
| 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 | ;; Supply some C++ specific dictionary fillers and helpers | ||
| 26 | |||
| 27 | ;;; Code: | ||
| 28 | |||
| 29 | ;;; :cpp ARGUMENT HANDLING | ||
| 30 | ;; | ||
| 31 | ;; When a :cpp argument is required, fill the dictionary with | ||
| 32 | ;; information about the current C++ file. | ||
| 33 | ;; | ||
| 34 | ;; Error if not in a C++ mode. | ||
| 35 | |||
| 36 | (require 'srecode) | ||
| 37 | (require 'srecode/dictionary) | ||
| 38 | (require 'srecode/semantic) | ||
| 39 | |||
| 40 | ;;;###autoload | ||
| 41 | (defun srecode-semantic-handle-:cpp (dict) | ||
| 42 | "Add macros into the dictionary DICT based on the current c++ file. | ||
| 43 | Adds the following: | ||
| 44 | FILENAME_SYMBOL - filename converted into a C compat symbol. | ||
| 45 | HEADER - Shown section if in a header file." | ||
| 46 | ;; A symbol representing | ||
| 47 | (let ((fsym (file-name-nondirectory (buffer-file-name))) | ||
| 48 | (case-fold-search t)) | ||
| 49 | |||
| 50 | ;; Are we in a header file? | ||
| 51 | (if (string-match "\\.\\(h\\|hh\\|hpp\\|h\\+\\+\\)$" fsym) | ||
| 52 | (srecode-dictionary-show-section dict "HEADER") | ||
| 53 | (srecode-dictionary-show-section dict "NOTHEADER")) | ||
| 54 | |||
| 55 | ;; Strip out bad characters | ||
| 56 | (while (string-match "\\.\\| " fsym) | ||
| 57 | (setq fsym (replace-match "_" t t fsym))) | ||
| 58 | (srecode-dictionary-set-value dict "FILENAME_SYMBOL" fsym) | ||
| 59 | ) | ||
| 60 | ) | ||
| 61 | |||
| 62 | (define-mode-local-override srecode-semantic-apply-tag-to-dict | ||
| 63 | c++-mode (tag-wrapper dict) | ||
| 64 | "Apply C++ specific features from TAG-WRAPPER into DICT. | ||
| 65 | Calls `srecode-semantic-apply-tag-to-dict-default' first. Adds | ||
| 66 | special behavior for tag of classes include, using and function." | ||
| 67 | |||
| 68 | ;; Use default implementation to fill in the basic properties. | ||
| 69 | (srecode-semantic-apply-tag-to-dict-default tag-wrapper dict) | ||
| 70 | |||
| 71 | ;; Pull out the tag for the individual pieces. | ||
| 72 | (let* ((tag (oref tag-wrapper :prime)) | ||
| 73 | (class (semantic-tag-class tag))) | ||
| 74 | |||
| 75 | ;; Add additional information based on the class of the tag. | ||
| 76 | (cond | ||
| 77 | ;; | ||
| 78 | ;; INCLUDE | ||
| 79 | ;; | ||
| 80 | ((eq class 'include) | ||
| 81 | ;; For include tags, we have to discriminate between system-wide | ||
| 82 | ;; and local includes. | ||
| 83 | (if (semantic-tag-include-system-p tag) | ||
| 84 | (srecode-dictionary-show-section dict "SYSTEM") | ||
| 85 | (srecode-dictionary-show-section dict "LOCAL"))) | ||
| 86 | |||
| 87 | ;; | ||
| 88 | ;; USING | ||
| 89 | ;; | ||
| 90 | ((eq class 'using) | ||
| 91 | ;; Insert the subject (a tag) of the include statement as VALUE | ||
| 92 | ;; entry into the dictionary. | ||
| 93 | (let ((value-tag (semantic-tag-get-attribute tag :value)) | ||
| 94 | (value-dict (srecode-dictionary-add-section-dictionary | ||
| 95 | dict "VALUE"))) | ||
| 96 | (srecode-semantic-apply-tag-to-dict | ||
| 97 | (srecode-semantic-tag (semantic-tag-name value-tag) | ||
| 98 | :prime value-tag) | ||
| 99 | value-dict)) | ||
| 100 | ;; Discriminate using statements referring to namespaces and | ||
| 101 | ;; types. | ||
| 102 | (when (eq (semantic-tag-get-attribute tag :kind) 'namespace) | ||
| 103 | (srecode-dictionary-show-section dict "NAMESPACE"))) | ||
| 104 | |||
| 105 | ;; | ||
| 106 | ;; FUNCTION | ||
| 107 | ;; | ||
| 108 | ((eq class 'function) | ||
| 109 | ;; @todo It would be nice to distinguish member functions from | ||
| 110 | ;; free functions and only apply the const and pure modifiers, | ||
| 111 | ;; when they make sense. My best bet would be | ||
| 112 | ;; (semantic-tag-function-parent tag), but it is not there, when | ||
| 113 | ;; the function is defined in the scope of a class. | ||
| 114 | (let ((member 't) | ||
| 115 | (modifiers (semantic-tag-modifiers tag))) | ||
| 116 | |||
| 117 | ;; Add modifiers into the dictionary | ||
| 118 | (dolist (modifier modifiers) | ||
| 119 | (let ((modifier-dict (srecode-dictionary-add-section-dictionary | ||
| 120 | dict "MODIFIERS"))) | ||
| 121 | (srecode-dictionary-set-value modifier-dict "NAME" modifier))) | ||
| 122 | |||
| 123 | ;; When the function is a member function, it can have | ||
| 124 | ;; additional modifiers. | ||
| 125 | (when member | ||
| 126 | |||
| 127 | ;; For member functions, constness is called | ||
| 128 | ;; 'methodconst-flag'. | ||
| 129 | (when (semantic-tag-get-attribute tag :methodconst-flag) | ||
| 130 | (srecode-dictionary-show-section dict "CONST")) | ||
| 131 | |||
| 132 | ;; If the member function is pure virtual, add a dictionary | ||
| 133 | ;; entry. | ||
| 134 | (when (semantic-tag-get-attribute tag :pure-virtual-flag) | ||
| 135 | (srecode-dictionary-show-section dict "PURE")) | ||
| 136 | ) | ||
| 137 | )) | ||
| 138 | )) | ||
| 139 | ) | ||
| 140 | |||
| 141 | (provide 'srecode/cpp) | ||
| 142 | |||
| 143 | ;; Local variables: | ||
| 144 | ;; generated-autoload-file: "loaddefs.el" | ||
| 145 | ;; generated-autoload-feature: srecode/loaddefs | ||
| 146 | ;; generated-autoload-load-name: "srecode/cpp" | ||
| 147 | ;; End: | ||
| 148 | |||
| 149 | ;;; srecode/cpp.el ends here | ||