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