1 /*==-- clang-c/Documentation.h - Utilities for comment processing -*- C -*-===*\
2 |*                                                                            *|
3 |*                     The LLVM Compiler Infrastructure                       *|
4 |*                                                                            *|
5 |* This file is distributed under the University of Illinois Open Source      *|
6 |* License. See LICENSE.TXT for details.                                      *|
7 |*                                                                            *|
8 |*===----------------------------------------------------------------------===*|
9 |*                                                                            *|
10 |* This header provides a supplementary interface for inspecting              *|
11 |* documentation comments.                                                    *|
12 |*                                                                            *|
13 \*===----------------------------------------------------------------------===*/
14 
15 module clang.c.Documentation;
16 
17 public import clang.c.CXString;
18 public import clang.c.Index;
19 
20 extern (C):
21 
22 /**
23  * \defgroup CINDEX_COMMENT Comment introspection
24  *
25  * The routines in this group provide access to information in documentation
26  * comments. These facilities are distinct from the core and may be subject to
27  * their own schedule of stability and deprecation.
28  *
29  * @{
30  */
31 
32 /**
33  * A parsed comment.
34  */
35 struct CXComment
36 {
37     const(void)* ASTNode;
38     CXTranslationUnit TranslationUnit;
39 }
40 
41 /**
42  * Given a cursor that represents a documentable entity (e.g.,
43  * declaration), return the associated parsed comment as a
44  * \c CXComment_FullComment AST node.
45  */
46 CXComment clang_Cursor_getParsedComment(CXCursor C);
47 
48 /**
49  * Describes the type of the comment AST node (\c CXComment).  A comment
50  * node can be considered block content (e. g., paragraph), inline content
51  * (plain text) or neither (the root AST node).
52  */
53 enum CXCommentKind
54 {
55     /**
56      * Null comment.  No AST node is constructed at the requested location
57      * because there is no text or a syntax error.
58      */
59     null_ = 0,
60 
61     /**
62      * Plain text.  Inline content.
63      */
64     text = 1,
65 
66     /**
67      * A command with word-like arguments that is considered inline content.
68      *
69      * For example: \\c command.
70      */
71     inlineCommand = 2,
72 
73     /**
74      * HTML start tag with attributes (name-value pairs).  Considered
75      * inline content.
76      *
77      * For example:
78      * \verbatim
79      * <br> <br /> <a href="http://example.org/">
80      * \endverbatim
81      */
82     htmlStartTag = 3,
83 
84     /**
85      * HTML end tag.  Considered inline content.
86      *
87      * For example:
88      * \verbatim
89      * </a>
90      * \endverbatim
91      */
92     htmlEndTag = 4,
93 
94     /**
95      * A paragraph, contains inline comment.  The paragraph itself is
96      * block content.
97      */
98     paragraph = 5,
99 
100     /**
101      * A command that has zero or more word-like arguments (number of
102      * word-like arguments depends on command name) and a paragraph as an
103      * argument.  Block command is block content.
104      *
105      * Paragraph argument is also a child of the block command.
106      *
107      * For example: \has 0 word-like arguments and a paragraph argument.
108      *
109      * AST nodes of special kinds that parser knows about (e. g., \\param
110      * command) have their own node kinds.
111      */
112     blockCommand = 6,
113 
114     /**
115      * A \\param or \\arg command that describes the function parameter
116      * (name, passing direction, description).
117      *
118      * For example: \\param [in] ParamName description.
119      */
120     paramCommand = 7,
121 
122     /**
123      * A \\tparam command that describes a template parameter (name and
124      * description).
125      *
126      * For example: \\tparam T description.
127      */
128     tParamCommand = 8,
129 
130     /**
131      * A verbatim block command (e. g., preformatted code).  Verbatim
132      * block has an opening and a closing command and contains multiple lines of
133      * text (\c CXComment_VerbatimBlockLine child nodes).
134      *
135      * For example:
136      * \\verbatim
137      * aaa
138      * \\endverbatim
139      */
140     verbatimBlockCommand = 9,
141 
142     /**
143      * A line of text that is contained within a
144      * CXComment_VerbatimBlockCommand node.
145      */
146     verbatimBlockLine = 10,
147 
148     /**
149      * A verbatim line command.  Verbatim line has an opening command,
150      * a single line of text (up to the newline after the opening command) and
151      * has no closing command.
152      */
153     verbatimLine = 11,
154 
155     /**
156      * A full comment attached to a declaration, contains block content.
157      */
158     fullComment = 12
159 }
160 
161 /**
162  * The most appropriate rendering mode for an inline command, chosen on
163  * command semantics in Doxygen.
164  */
165 enum CXCommentInlineCommandRenderKind
166 {
167     /**
168      * Command argument should be rendered in a normal font.
169      */
170     normal = 0,
171 
172     /**
173      * Command argument should be rendered in a bold font.
174      */
175     bold = 1,
176 
177     /**
178      * Command argument should be rendered in a monospaced font.
179      */
180     monospaced = 2,
181 
182     /**
183      * Command argument should be rendered emphasized (typically italic
184      * font).
185      */
186     emphasized = 3
187 }
188 
189 /**
190  * Describes parameter passing direction for \\param or \\arg command.
191  */
192 enum CXCommentParamPassDirection
193 {
194     /**
195      * The parameter is an input parameter.
196      */
197     in_ = 0,
198 
199     /**
200      * The parameter is an output parameter.
201      */
202     out_ = 1,
203 
204     /**
205      * The parameter is an input and output parameter.
206      */
207     inOut = 2
208 }
209 
210 /**
211  * \param Comment AST node of any kind.
212  *
213  * \returns the type of the AST node.
214  */
215 CXCommentKind clang_Comment_getKind(CXComment Comment);
216 
217 /**
218  * \param Comment AST node of any kind.
219  *
220  * \returns number of children of the AST node.
221  */
222 uint clang_Comment_getNumChildren(CXComment Comment);
223 
224 /**
225  * \param Comment AST node of any kind.
226  *
227  * \param ChildIdx child index (zero-based).
228  *
229  * \returns the specified child of the AST node.
230  */
231 CXComment clang_Comment_getChild(CXComment Comment, uint ChildIdx);
232 
233 /**
234  * A \c CXComment_Paragraph node is considered whitespace if it contains
235  * only \c CXComment_Text nodes that are empty or whitespace.
236  *
237  * Other AST nodes (except \c CXComment_Paragraph and \c CXComment_Text) are
238  * never considered whitespace.
239  *
240  * \returns non-zero if \c Comment is whitespace.
241  */
242 uint clang_Comment_isWhitespace(CXComment Comment);
243 
244 /**
245  * \returns non-zero if \c Comment is inline content and has a newline
246  * immediately following it in the comment text.  Newlines between paragraphs
247  * do not count.
248  */
249 uint clang_InlineContentComment_hasTrailingNewline(CXComment Comment);
250 
251 /**
252  * \param Comment a \c CXComment_Text AST node.
253  *
254  * \returns text contained in the AST node.
255  */
256 CXString clang_TextComment_getText(CXComment Comment);
257 
258 /**
259  * \param Comment a \c CXComment_InlineCommand AST node.
260  *
261  * \returns name of the inline command.
262  */
263 CXString clang_InlineCommandComment_getCommandName(CXComment Comment);
264 
265 /**
266  * \param Comment a \c CXComment_InlineCommand AST node.
267  *
268  * \returns the most appropriate rendering mode, chosen on command
269  * semantics in Doxygen.
270  */
271 CXCommentInlineCommandRenderKind clang_InlineCommandComment_getRenderKind(
272     CXComment Comment);
273 
274 /**
275  * \param Comment a \c CXComment_InlineCommand AST node.
276  *
277  * \returns number of command arguments.
278  */
279 uint clang_InlineCommandComment_getNumArgs(CXComment Comment);
280 
281 /**
282  * \param Comment a \c CXComment_InlineCommand AST node.
283  *
284  * \param ArgIdx argument index (zero-based).
285  *
286  * \returns text of the specified argument.
287  */
288 CXString clang_InlineCommandComment_getArgText(CXComment Comment, uint ArgIdx);
289 
290 /**
291  * \param Comment a \c CXComment_HTMLStartTag or \c CXComment_HTMLEndTag AST
292  * node.
293  *
294  * \returns HTML tag name.
295  */
296 CXString clang_HTMLTagComment_getTagName(CXComment Comment);
297 
298 /**
299  * \param Comment a \c CXComment_HTMLStartTag AST node.
300  *
301  * \returns non-zero if tag is self-closing (for example, &lt;br /&gt;).
302  */
303 uint clang_HTMLStartTagComment_isSelfClosing(CXComment Comment);
304 
305 /**
306  * \param Comment a \c CXComment_HTMLStartTag AST node.
307  *
308  * \returns number of attributes (name-value pairs) attached to the start tag.
309  */
310 uint clang_HTMLStartTag_getNumAttrs(CXComment Comment);
311 
312 /**
313  * \param Comment a \c CXComment_HTMLStartTag AST node.
314  *
315  * \param AttrIdx attribute index (zero-based).
316  *
317  * \returns name of the specified attribute.
318  */
319 CXString clang_HTMLStartTag_getAttrName(CXComment Comment, uint AttrIdx);
320 
321 /**
322  * \param Comment a \c CXComment_HTMLStartTag AST node.
323  *
324  * \param AttrIdx attribute index (zero-based).
325  *
326  * \returns value of the specified attribute.
327  */
328 CXString clang_HTMLStartTag_getAttrValue(CXComment Comment, uint AttrIdx);
329 
330 /**
331  * \param Comment a \c CXComment_BlockCommand AST node.
332  *
333  * \returns name of the block command.
334  */
335 CXString clang_BlockCommandComment_getCommandName(CXComment Comment);
336 
337 /**
338  * \param Comment a \c CXComment_BlockCommand AST node.
339  *
340  * \returns number of word-like arguments.
341  */
342 uint clang_BlockCommandComment_getNumArgs(CXComment Comment);
343 
344 /**
345  * \param Comment a \c CXComment_BlockCommand AST node.
346  *
347  * \param ArgIdx argument index (zero-based).
348  *
349  * \returns text of the specified word-like argument.
350  */
351 CXString clang_BlockCommandComment_getArgText(CXComment Comment, uint ArgIdx);
352 
353 /**
354  * \param Comment a \c CXComment_BlockCommand or
355  * \c CXComment_VerbatimBlockCommand AST node.
356  *
357  * \returns paragraph argument of the block command.
358  */
359 CXComment clang_BlockCommandComment_getParagraph(CXComment Comment);
360 
361 /**
362  * \param Comment a \c CXComment_ParamCommand AST node.
363  *
364  * \returns parameter name.
365  */
366 CXString clang_ParamCommandComment_getParamName(CXComment Comment);
367 
368 /**
369  * \param Comment a \c CXComment_ParamCommand AST node.
370  *
371  * \returns non-zero if the parameter that this AST node represents was found
372  * in the function prototype and \c clang_ParamCommandComment_getParamIndex
373  * function will return a meaningful value.
374  */
375 uint clang_ParamCommandComment_isParamIndexValid(CXComment Comment);
376 
377 /**
378  * \param Comment a \c CXComment_ParamCommand AST node.
379  *
380  * \returns zero-based parameter index in function prototype.
381  */
382 uint clang_ParamCommandComment_getParamIndex(CXComment Comment);
383 
384 /**
385  * \param Comment a \c CXComment_ParamCommand AST node.
386  *
387  * \returns non-zero if parameter passing direction was specified explicitly in
388  * the comment.
389  */
390 uint clang_ParamCommandComment_isDirectionExplicit(CXComment Comment);
391 
392 /**
393  * \param Comment a \c CXComment_ParamCommand AST node.
394  *
395  * \returns parameter passing direction.
396  */
397 CXCommentParamPassDirection clang_ParamCommandComment_getDirection(
398     CXComment Comment);
399 
400 /**
401  * \param Comment a \c CXComment_TParamCommand AST node.
402  *
403  * \returns template parameter name.
404  */
405 CXString clang_TParamCommandComment_getParamName(CXComment Comment);
406 
407 /**
408  * \param Comment a \c CXComment_TParamCommand AST node.
409  *
410  * \returns non-zero if the parameter that this AST node represents was found
411  * in the template parameter list and
412  * \c clang_TParamCommandComment_getDepth and
413  * \c clang_TParamCommandComment_getIndex functions will return a meaningful
414  * value.
415  */
416 uint clang_TParamCommandComment_isParamPositionValid(CXComment Comment);
417 
418 /**
419  * \param Comment a \c CXComment_TParamCommand AST node.
420  *
421  * \returns zero-based nesting depth of this parameter in the template parameter list.
422  *
423  * For example,
424  * \verbatim
425  *     template<typename C, template<typename T> class TT>
426  *     void test(TT<int> aaa);
427  * \endverbatim
428  * for C and TT nesting depth is 0,
429  * for T nesting depth is 1.
430  */
431 uint clang_TParamCommandComment_getDepth(CXComment Comment);
432 
433 /**
434  * \param Comment a \c CXComment_TParamCommand AST node.
435  *
436  * \returns zero-based parameter index in the template parameter list at a
437  * given nesting depth.
438  *
439  * For example,
440  * \verbatim
441  *     template<typename C, template<typename T> class TT>
442  *     void test(TT<int> aaa);
443  * \endverbatim
444  * for C and TT nesting depth is 0, so we can ask for index at depth 0:
445  * at depth 0 C's index is 0, TT's index is 1.
446  *
447  * For T nesting depth is 1, so we can ask for index at depth 0 and 1:
448  * at depth 0 T's index is 1 (same as TT's),
449  * at depth 1 T's index is 0.
450  */
451 uint clang_TParamCommandComment_getIndex(CXComment Comment, uint Depth);
452 
453 /**
454  * \param Comment a \c CXComment_VerbatimBlockLine AST node.
455  *
456  * \returns text contained in the AST node.
457  */
458 CXString clang_VerbatimBlockLineComment_getText(CXComment Comment);
459 
460 /**
461  * \param Comment a \c CXComment_VerbatimLine AST node.
462  *
463  * \returns text contained in the AST node.
464  */
465 CXString clang_VerbatimLineComment_getText(CXComment Comment);
466 
467 /**
468  * Convert an HTML tag AST node to string.
469  *
470  * \param Comment a \c CXComment_HTMLStartTag or \c CXComment_HTMLEndTag AST
471  * node.
472  *
473  * \returns string containing an HTML tag.
474  */
475 CXString clang_HTMLTagComment_getAsString(CXComment Comment);
476 
477 /**
478  * Convert a given full parsed comment to an HTML fragment.
479  *
480  * Specific details of HTML layout are subject to change.  Don't try to parse
481  * this HTML back into an AST, use other APIs instead.
482  *
483  * Currently the following CSS classes are used:
484  * \li "para-brief" for \paragraph and equivalent commands;
485  * \li "para-returns" for \\returns paragraph and equivalent commands;
486  * \li "word-returns" for the "Returns" word in \\returns paragraph.
487  *
488  * Function argument documentation is rendered as a \<dl\> list with arguments
489  * sorted in function prototype order.  CSS classes used:
490  * \li "param-name-index-NUMBER" for parameter name (\<dt\>);
491  * \li "param-descr-index-NUMBER" for parameter description (\<dd\>);
492  * \li "param-name-index-invalid" and "param-descr-index-invalid" are used if
493  * parameter index is invalid.
494  *
495  * Template parameter documentation is rendered as a \<dl\> list with
496  * parameters sorted in template parameter list order.  CSS classes used:
497  * \li "tparam-name-index-NUMBER" for parameter name (\<dt\>);
498  * \li "tparam-descr-index-NUMBER" for parameter description (\<dd\>);
499  * \li "tparam-name-index-other" and "tparam-descr-index-other" are used for
500  * names inside template template parameters;
501  * \li "tparam-name-index-invalid" and "tparam-descr-index-invalid" are used if
502  * parameter position is invalid.
503  *
504  * \param Comment a \c CXComment_FullComment AST node.
505  *
506  * \returns string containing an HTML fragment.
507  */
508 CXString clang_FullComment_getAsHTML(CXComment Comment);
509 
510 /**
511  * Convert a given full parsed comment to an XML document.
512  *
513  * A Relax NG schema for the XML can be found in comment-xml-schema.rng file
514  * inside clang source tree.
515  *
516  * \param Comment a \c CXComment_FullComment AST node.
517  *
518  * \returns string containing an XML document.
519  */
520 CXString clang_FullComment_getAsXML(CXComment Comment);
521 
522 /**
523  * @}
524  */
525 
526 /* CLANG_C_DOCUMENTATION_H */