diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2009-09-20 21:06:41 +0000 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2009-09-20 21:06:41 +0000 |
commit | 4d902e6f13f6bf5d304a0cbcff33e2780a825206 (patch) | |
tree | 20c5dbf4febbaff55e22b4fa0e950cf552e88e70 /lisp/cedet/srecode/expandproto.el | |
parent | 70702e9b0ea781fb955c66320c935bc0a8e1d0f1 (diff) | |
download | emacs-4d902e6f13f6bf5d304a0cbcff33e2780a825206.tar.gz |
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/expandproto.el')
-rw-r--r-- | lisp/cedet/srecode/expandproto.el | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/lisp/cedet/srecode/expandproto.el b/lisp/cedet/srecode/expandproto.el new file mode 100644 index 00000000000..eb09ed260bd --- /dev/null +++ b/lisp/cedet/srecode/expandproto.el @@ -0,0 +1,132 @@ +;;; srecode/expandproto.el --- Expanding prototypes. + +;; Copyright (C) 2007 Free Software Foundation, Inc. + +;; Author: Eric M. Ludlam <eric@siege-engine.com> + +;; 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: +;; +;; Methods for expanding a prototype into an implementation. + +(require 'ring) +(require 'semantic) +(require 'semantic/analyze) +(require 'srecode/insert) +(require 'srecode/dictionary) + +(declare-function semantic-brute-find-tag-by-attribute-value "semantic/find") + +;;; Code: +(defcustom srecode-expandproto-template-file-alist + '( ( c++-mode . "srecode-expandproto-cpp.srt" ) + ) + ;; @todo - Make this variable auto-generated from the Makefile. + "Associate template files for expanding prototypes to a major mode." + :group 'srecode + :type '(repeat (cons (sexp :tag "Mode") + (sexp :tag "Filename")) + )) + +;;;###autoload +(defun srecode-insert-prototype-expansion () + "Insert get/set methods for the current class." + (interactive) + + (srecode-load-tables-for-mode major-mode) + (srecode-load-tables-for-mode major-mode + srecode-expandproto-template-file-alist) + + (if (not (srecode-table)) + (error "No template table found for mode %s" major-mode)) + + (let ((proto + ;; Step 1: Find the prototype, or prototype list to expand. + (srecode-find-prototype-for-expansion))) + + (if (not proto) + (error "Could not find prototype to expand")) + + ;; Step 2: Insert implementations of the prototypes. + + + )) + +(defun srecode-find-prototype-for-expansion () + "Find a prototype to use for expanding into an implementation." + ;; We may find a prototype tag in one of several places. + ;; Search in order of logical priority. + (let ((proto nil) + ) + + ;; 1) A class full of prototypes under point. + (let ((tag (semantic-current-tag))) + (when tag + (when (not (semantic-tag-of-class-p tag 'type)) + (setq tag (semantic-current-tag-parent)))) + (when (and tag (semantic-tag-of-class-p tag 'type)) + ;; If the current class has prototype members, then + ;; we will do the whole class! + (require 'semantic/find) + (if (semantic-brute-find-tag-by-attribute-value + :prototype t + (semantic-tag-type-members tag)) + (setq proto tag))) + ) + + ;; 2) A prototype under point. + (when (not proto) + (let ((tag (semantic-current-tag))) + (when (and tag + (and + (semantic-tag-of-class-p tag 'function) + (semantic-tag-get-attribute tag :prototype))) + (setq proto tag)))) + + ;; 3) A tag in the kill ring that is a prototype + (when (not proto) + (if (ring-empty-p senator-tag-ring) + nil ;; Not for us. + (let ((tag (ring-ref senator-tag-ring 0)) + ) + (when + (and tag + (or + (and + (semantic-tag-of-class-p tag 'function) + (semantic-tag-get-attribute tag :prototype)) + (and + (semantic-tag-of-class-p tag 'type) + (require 'semantic/find) + (semantic-brute-find-tag-by-attribute-value + :prototype t + (semantic-tag-type-members tag)))) + ) + (setq proto tag)) + ))) + + proto)) + +(provide 'srecode-expandproto) + +;; Local variables: +;; generated-autoload-file: "loaddefs.el" +;; generated-autoload-feature: srecode/loaddefs +;; generated-autoload-load-name: "srecode/expandproto" +;; End: + +;;; srecode/expandproto.el ends here |