Add 2012 to FSF copyright years for Emacs files
[bpt/emacs.git] / lisp / cedet / semantic / doc.el
CommitLineData
978c25c6 1;;; semantic/doc.el --- Routines for documentation strings
a6de3d1a 2
acaf905b 3;; Copyright (C) 1999-2003, 2005, 2008-2012 Free Software Foundation, Inc.
a6de3d1a
CY
4
5;; Author: Eric M. Ludlam <zappo@gnu.org>
6;; Keywords: syntax
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;;
9bf6c65c 25;; It is good practice to write documentation for your functions and
a6de3d1a
CY
26;; variables. These core routines deal with these documentation
27;; comments or strings. They can exist either as a tag property
28;; (:documentation) or as a comment just before the symbol, or after
29;; the symbol on the same line.
30
31(require 'semantic/tag)
32
33;;; Code:
34
3d9d8486 35;;;###autoload
a6de3d1a
CY
36(define-overloadable-function semantic-documentation-for-tag (&optional tag nosnarf)
37 "Find documentation from TAG and return it as a clean string.
38TAG might have DOCUMENTATION set in it already. If not, there may be
39some documentation in a comment preceding TAG's definition which we
40can look for. When appropriate, this can be overridden by a language specific
41enhancement.
42Optional argument NOSNARF means to only return the lexical analyzer token for it.
43If nosnarf if 'lex, then only return the lex token."
44 (if (not tag) (setq tag (semantic-current-tag)))
45 (save-excursion
46 (when (semantic-tag-with-position-p tag)
47 (set-buffer (semantic-tag-buffer tag)))
48 (:override
49 ;; No override. Try something simple to find documentation nearby
50 (save-excursion
51 (semantic-go-to-tag tag)
52 (let ((doctmp (semantic-tag-docstring tag (current-buffer))))
53 (or
54 ;; Is there doc in the tag???
55 doctmp
56 ;; Check just before the definition.
57 (when (semantic-tag-with-position-p tag)
58 (semantic-documentation-comment-preceeding-tag tag nosnarf))
c7015153 59 ;; Let's look for comments either after the definition, but before code:
a6de3d1a
CY
60 ;; Not sure yet. Fill in something clever later....
61 nil))))))
62
9bf6c65c 63;; FIXME this is not how you spell "preceding".
a6de3d1a 64(defun semantic-documentation-comment-preceeding-tag (&optional tag nosnarf)
9bf6c65c 65 "Find a comment preceding TAG.
a6de3d1a 66If TAG is nil. use the tag under point.
9bf6c65c 67Searches the space between TAG and the preceding tag for a comment,
a6de3d1a
CY
68and converts the comment into clean documentation.
69Optional argument NOSNARF with a value of 'lex means to return
70just the lexical token and not the string."
71 (if (not tag) (setq tag (semantic-current-tag)))
72 (save-excursion
73 ;; Find this tag.
74 (semantic-go-to-tag tag)
75 (let* ((starttag (semantic-find-tag-by-overlay-prev
76 (semantic-tag-start tag)))
77 (start (if starttag
78 (semantic-tag-end starttag)
79 (point-min))))
dd9af436
CY
80 (when (and comment-start-skip
81 (re-search-backward comment-start-skip start t))
a6de3d1a
CY
82 ;; We found a comment that doesn't belong to the body
83 ;; of a function.
84 (semantic-doc-snarf-comment-for-tag nosnarf)))
85 ))
86
a6de3d1a
CY
87(defun semantic-doc-snarf-comment-for-tag (nosnarf)
88 "Snarf up the comment at POINT for `semantic-documentation-for-tag'.
89Attempt to strip out comment syntactic sugar.
90Argument NOSNARF means don't modify the found text.
91If NOSNARF is 'lex, then return the lex token."
92 (let* ((semantic-ignore-comments nil)
93 (semantic-lex-analyzer #'semantic-comment-lexer))
94 (if (memq nosnarf '(lex flex)) ;; keep `flex' for compatibility
95 (car (semantic-lex (point) (1+ (point))))
96 (let ((ct (semantic-lex-token-text
97 (car (semantic-lex (point) (1+ (point)))))))
98 (if nosnarf
99 nil
100 ;; ok, try to clean the text up.
101 ;; Comment start thingy
102 (while (string-match (concat "^\\s-*" comment-start-skip) ct)
103 (setq ct (concat (substring ct 0 (match-beginning 0))
104 (substring ct (match-end 0)))))
105 ;; Arbitrary punctuation at the beginning of each line.
106 (while (string-match "^\\s-*\\s.+\\s-*" ct)
107 (setq ct (concat (substring ct 0 (match-beginning 0))
108 (substring ct (match-end 0)))))
109 ;; End of a block comment.
110 (if (and (boundp 'block-comment-end)
111 block-comment-end
112 (string-match block-comment-end ct))
113 (setq ct (concat (substring ct 0 (match-beginning 0))
114 (substring ct (match-end 0)))))
115 ;; In case it's a real string, STRIPIT.
116 (while (string-match "\\s-*\\s\"+\\s-*" ct)
117 (setq ct (concat (substring ct 0 (match-beginning 0))
118 (substring ct (match-end 0))))))
119 ;; Now return the text.
120 ct))))
121
a6de3d1a
CY
122(provide 'semantic/doc)
123
3d9d8486
CY
124;; Local variables:
125;; generated-autoload-file: "loaddefs.el"
996bc9bf 126;; generated-autoload-load-name: "semantic/doc"
3d9d8486
CY
127;; End:
128
978c25c6 129;;; semantic/doc.el ends here