1ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//===- CXComment.cpp - libclang APIs for manipulating CXComments ----------===//
2ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//
3ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//                     The LLVM Compiler Infrastructure
4ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//
5ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko// This file is distributed under the University of Illinois Open Source
6ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko// License. See LICENSE.TXT for details.
7ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//
8ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//===----------------------------------------------------------------------===//
9ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//
10ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko// This file defines all libclang APIs related to walking comment AST.
11ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//
12ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//===----------------------------------------------------------------------===//
13ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
14ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko#include "clang-c/Index.h"
15ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko#include "CXComment.h"
16f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko#include "CXCursor.h"
17f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "CXString.h"
180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang-c/Documentation.h"
19f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko#include "clang/AST/Decl.h"
2086cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko#include "clang/Index/CommentToXML.h"
2188b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "llvm/ADT/StringExtras.h"
22f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko#include "llvm/ADT/StringSwitch.h"
23ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko#include "llvm/Support/ErrorHandling.h"
24221a6d74d48fb3eaa73b68eb04f253080bedd5fdDmitri Gribenko#include <climits>
25221a6d74d48fb3eaa73b68eb04f253080bedd5fdDmitri Gribenko
26ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkousing namespace clang;
27ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkousing namespace clang::comments;
28ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkousing namespace clang::cxcomment;
29ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
30ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkoextern "C" {
31ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCXComment clang_Cursor_getParsedComment(CXCursor C) {
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  using namespace clang::cxcursor;
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!clang_isDeclaration(C.kind))
36c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return createCXComment(nullptr, nullptr);
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const Decl *D = getCursorDecl(C);
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const ASTContext &Context = getCursorContext(C);
40c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const FullComment *FC = Context.getCommentForDecl(D, /*PP=*/nullptr);
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return createCXComment(FC, getCursorTU(C));
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
45ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkoenum CXCommentKind clang_Comment_getKind(CXComment CXC) {
46ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const Comment *C = getASTNode(CXC);
47ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!C)
48ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_Null;
49ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
50ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  switch (C->getCommentKind()) {
51ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::NoCommentKind:
52ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_Null;
53ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
54ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::TextCommentKind:
55ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_Text;
56ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
57ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::InlineCommandCommentKind:
58ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_InlineCommand;
59ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
60ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::HTMLStartTagCommentKind:
61ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_HTMLStartTag;
62ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
63ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::HTMLEndTagCommentKind:
64ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_HTMLEndTag;
65ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
66ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::ParagraphCommentKind:
67ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_Paragraph;
68ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
69ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::BlockCommandCommentKind:
70ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_BlockCommand;
71ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
72ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::ParamCommandCommentKind:
73ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_ParamCommand;
74ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
7596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  case Comment::TParamCommandCommentKind:
7696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    return CXComment_TParamCommand;
7796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
78ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::VerbatimBlockCommentKind:
79ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_VerbatimBlockCommand;
80ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
81ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::VerbatimBlockLineCommentKind:
82ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_VerbatimBlockLine;
83ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
84ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::VerbatimLineCommentKind:
85ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_VerbatimLine;
86ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
87ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case Comment::FullCommentKind:
88ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXComment_FullComment;
89ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  }
90ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  llvm_unreachable("unknown CommentKind");
91ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
92ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
93ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_Comment_getNumChildren(CXComment CXC) {
94ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const Comment *C = getASTNode(CXC);
95ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!C)
96ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return 0;
97ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
98ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return C->child_count();
99ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
100ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
101ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXComment clang_Comment_getChild(CXComment CXC, unsigned ChildIdx) {
102ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const Comment *C = getASTNode(CXC);
103ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!C || ChildIdx >= C->child_count())
104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return createCXComment(nullptr, nullptr);
105ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
106e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  return createCXComment(*(C->child_begin() + ChildIdx), CXC.TranslationUnit);
107ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
108ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
109ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_Comment_isWhitespace(CXComment CXC) {
110ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const Comment *C = getASTNode(CXC);
111ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!C)
112ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return false;
113ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
114ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (const TextComment *TC = dyn_cast<TextComment>(C))
115ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return TC->isWhitespace();
116ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
117ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (const ParagraphComment *PC = dyn_cast<ParagraphComment>(C))
118ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return PC->isWhitespace();
119ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
120ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return false;
121ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
122ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
123ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_InlineContentComment_hasTrailingNewline(CXComment CXC) {
124ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const InlineContentComment *ICC = getASTNodeAs<InlineContentComment>(CXC);
125ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!ICC)
126ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return false;
127ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
128ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return ICC->hasTrailingNewline();
129ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
130ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
131ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_TextComment_getText(CXComment CXC) {
132ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const TextComment *TC = getASTNodeAs<TextComment>(CXC);
133ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!TC)
134dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
135ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
1365595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(TC->getText());
137ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
138ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
139ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_InlineCommandComment_getCommandName(CXComment CXC) {
140ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const InlineCommandComment *ICC = getASTNodeAs<InlineCommandComment>(CXC);
141ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!ICC)
142dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
143ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
144e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  const CommandTraits &Traits = getCommandTraits(CXC);
1455595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(ICC->getCommandName(Traits));
146ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
147ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
1482d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenkoenum CXCommentInlineCommandRenderKind
1492d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenkoclang_InlineCommandComment_getRenderKind(CXComment CXC) {
1502d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  const InlineCommandComment *ICC = getASTNodeAs<InlineCommandComment>(CXC);
1512d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  if (!ICC)
1522d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko    return CXCommentInlineCommandRenderKind_Normal;
1532d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko
1542d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  switch (ICC->getRenderKind()) {
1552d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  case InlineCommandComment::RenderNormal:
1562d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko    return CXCommentInlineCommandRenderKind_Normal;
1572d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko
1582d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  case InlineCommandComment::RenderBold:
1592d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko    return CXCommentInlineCommandRenderKind_Bold;
1602d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko
1612d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  case InlineCommandComment::RenderMonospaced:
1622d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko    return CXCommentInlineCommandRenderKind_Monospaced;
1632d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko
1642d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  case InlineCommandComment::RenderEmphasized:
1652d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko    return CXCommentInlineCommandRenderKind_Emphasized;
1662d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  }
1672d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko  llvm_unreachable("unknown InlineCommandComment::RenderKind");
1682d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko}
1692d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko
170ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_InlineCommandComment_getNumArgs(CXComment CXC) {
171ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const InlineCommandComment *ICC = getASTNodeAs<InlineCommandComment>(CXC);
172ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!ICC)
173ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return 0;
174ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
175ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return ICC->getNumArgs();
176ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
177ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
178ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_InlineCommandComment_getArgText(CXComment CXC,
179ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko                                               unsigned ArgIdx) {
180ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const InlineCommandComment *ICC = getASTNodeAs<InlineCommandComment>(CXC);
181ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!ICC || ArgIdx >= ICC->getNumArgs())
182dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
183ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
1845595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(ICC->getArgText(ArgIdx));
185ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
186ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
187ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_HTMLTagComment_getTagName(CXComment CXC) {
188ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const HTMLTagComment *HTC = getASTNodeAs<HTMLTagComment>(CXC);
189ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!HTC)
190dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
191ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
1925595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(HTC->getTagName());
193ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
194ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
195ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_HTMLStartTagComment_isSelfClosing(CXComment CXC) {
196ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const HTMLStartTagComment *HST = getASTNodeAs<HTMLStartTagComment>(CXC);
197ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!HST)
198ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return false;
199ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
200ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return HST->isSelfClosing();
201ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
202ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
203ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_HTMLStartTag_getNumAttrs(CXComment CXC) {
204ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const HTMLStartTagComment *HST = getASTNodeAs<HTMLStartTagComment>(CXC);
205ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!HST)
206ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return 0;
207ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
208ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return HST->getNumAttrs();
209ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
210ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
211ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_HTMLStartTag_getAttrName(CXComment CXC, unsigned AttrIdx) {
212ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const HTMLStartTagComment *HST = getASTNodeAs<HTMLStartTagComment>(CXC);
213ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!HST || AttrIdx >= HST->getNumAttrs())
214dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
215ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
2165595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(HST->getAttr(AttrIdx).Name);
217ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
218ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
219ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_HTMLStartTag_getAttrValue(CXComment CXC, unsigned AttrIdx) {
220ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const HTMLStartTagComment *HST = getASTNodeAs<HTMLStartTagComment>(CXC);
221ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!HST || AttrIdx >= HST->getNumAttrs())
222dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
223ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
2245595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(HST->getAttr(AttrIdx).Value);
225ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
226ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
227ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_BlockCommandComment_getCommandName(CXComment CXC) {
228ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const BlockCommandComment *BCC = getASTNodeAs<BlockCommandComment>(CXC);
229ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!BCC)
230dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
231ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
232e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  const CommandTraits &Traits = getCommandTraits(CXC);
2335595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(BCC->getCommandName(Traits));
234ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
235ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
236ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_BlockCommandComment_getNumArgs(CXComment CXC) {
237ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const BlockCommandComment *BCC = getASTNodeAs<BlockCommandComment>(CXC);
238ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!BCC)
239ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return 0;
240ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
241ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return BCC->getNumArgs();
242ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
243ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
244ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_BlockCommandComment_getArgText(CXComment CXC,
245ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko                                              unsigned ArgIdx) {
246ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const BlockCommandComment *BCC = getASTNodeAs<BlockCommandComment>(CXC);
247ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!BCC || ArgIdx >= BCC->getNumArgs())
248dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
249ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
2505595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(BCC->getArgText(ArgIdx));
251ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
252ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
253ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXComment clang_BlockCommandComment_getParagraph(CXComment CXC) {
254ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const BlockCommandComment *BCC = getASTNodeAs<BlockCommandComment>(CXC);
255ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!BCC)
256c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return createCXComment(nullptr, nullptr);
257ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
258e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  return createCXComment(BCC->getParagraph(), CXC.TranslationUnit);
259ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
260ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
261ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_ParamCommandComment_getParamName(CXComment CXC) {
262ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const ParamCommandComment *PCC = getASTNodeAs<ParamCommandComment>(CXC);
2631f8c529a2a938a5055f440aa063ea0b49eafae98Dmitri Gribenko  if (!PCC || !PCC->hasParamName())
264dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
265ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
2665595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(PCC->getParamNameAsWritten());
267ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
268ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
269ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_ParamCommandComment_isParamIndexValid(CXComment CXC) {
270ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const ParamCommandComment *PCC = getASTNodeAs<ParamCommandComment>(CXC);
271ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!PCC)
272ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return false;
273ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
274ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return PCC->isParamIndexValid();
275ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
276ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
277ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_ParamCommandComment_getParamIndex(CXComment CXC) {
278ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const ParamCommandComment *PCC = getASTNodeAs<ParamCommandComment>(CXC);
279c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko  if (!PCC || !PCC->isParamIndexValid() || PCC->isVarArgParam())
280ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return ParamCommandComment::InvalidParamIndex;
281ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
282ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return PCC->getParamIndex();
283ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
284ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
285ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkounsigned clang_ParamCommandComment_isDirectionExplicit(CXComment CXC) {
286ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const ParamCommandComment *PCC = getASTNodeAs<ParamCommandComment>(CXC);
287ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!PCC)
288ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return false;
289ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
290ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  return PCC->isDirectionExplicit();
291ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
292ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
293ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenkoenum CXCommentParamPassDirection clang_ParamCommandComment_getDirection(
294ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko                                                            CXComment CXC) {
295ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const ParamCommandComment *PCC = getASTNodeAs<ParamCommandComment>(CXC);
296ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!PCC)
297ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXCommentParamPassDirection_In;
298ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
299ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  switch (PCC->getDirection()) {
300ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case ParamCommandComment::In:
301ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXCommentParamPassDirection_In;
302ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
303ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case ParamCommandComment::Out:
304ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXCommentParamPassDirection_Out;
305ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
306ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  case ParamCommandComment::InOut:
307ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko    return CXCommentParamPassDirection_InOut;
308ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  }
309ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  llvm_unreachable("unknown ParamCommandComment::PassDirection");
310ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
311ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
31296b098674908eaa59a9128f3305cda6fbbdad563Dmitri GribenkoCXString clang_TParamCommandComment_getParamName(CXComment CXC) {
31396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  const TParamCommandComment *TPCC = getASTNodeAs<TParamCommandComment>(CXC);
31496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  if (!TPCC || !TPCC->hasParamName())
315dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
31696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
3175595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(TPCC->getParamNameAsWritten());
31896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko}
31996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
32096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkounsigned clang_TParamCommandComment_isParamPositionValid(CXComment CXC) {
32196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  const TParamCommandComment *TPCC = getASTNodeAs<TParamCommandComment>(CXC);
32296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  if (!TPCC)
32396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    return false;
32496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
32596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  return TPCC->isPositionValid();
32696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko}
32796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
32896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkounsigned clang_TParamCommandComment_getDepth(CXComment CXC) {
32996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  const TParamCommandComment *TPCC = getASTNodeAs<TParamCommandComment>(CXC);
33096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  if (!TPCC || !TPCC->isPositionValid())
33196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    return 0;
33296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
33396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  return TPCC->getDepth();
33496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko}
33596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
33696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkounsigned clang_TParamCommandComment_getIndex(CXComment CXC, unsigned Depth) {
33796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  const TParamCommandComment *TPCC = getASTNodeAs<TParamCommandComment>(CXC);
33896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  if (!TPCC || !TPCC->isPositionValid() || Depth >= TPCC->getDepth())
33996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    return 0;
34096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
34196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko  return TPCC->getIndex(Depth);
34296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko}
34396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
344ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_VerbatimBlockLineComment_getText(CXComment CXC) {
345ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const VerbatimBlockLineComment *VBL =
346ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko      getASTNodeAs<VerbatimBlockLineComment>(CXC);
347ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!VBL)
348dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
349ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
3505595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(VBL->getText());
351ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
352ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
353ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_VerbatimLineComment_getText(CXComment CXC) {
354ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const VerbatimLineComment *VLC = getASTNodeAs<VerbatimLineComment>(CXC);
355ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!VLC)
356dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
357ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
3585595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createRef(VLC->getText());
359ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
360ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
361ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//===----------------------------------------------------------------------===//
36286cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko// Converting comments to XML.
363ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko//===----------------------------------------------------------------------===//
364ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
365ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_HTMLTagComment_getAsString(CXComment CXC) {
366ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const HTMLTagComment *HTC = getASTNodeAs<HTMLTagComment>(CXC);
367ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!HTC)
368dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
369ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
37086cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  CXTranslationUnit TU = CXC.TranslationUnit;
37186cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  if (!TU->CommentToXML)
3724d0ddecbe7dbbfeb89e428ed6e19c3cf12325087Dmitri Gribenko    TU->CommentToXML = new clang::index::CommentToXMLConverter();
37386cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko
37486cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  SmallString<128> Text;
37586cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  TU->CommentToXML->convertHTMLTagNodeToText(
37686cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko      HTC, Text, cxtu::getASTUnit(TU)->getASTContext());
37786cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  return cxstring::createDup(Text.str());
378ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
379ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
380ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri GribenkoCXString clang_FullComment_getAsHTML(CXComment CXC) {
381ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  const FullComment *FC = getASTNodeAs<FullComment>(CXC);
382ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko  if (!FC)
383dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
384ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
38586cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  CXTranslationUnit TU = CXC.TranslationUnit;
38686cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  if (!TU->CommentToXML)
3874d0ddecbe7dbbfeb89e428ed6e19c3cf12325087Dmitri Gribenko    TU->CommentToXML = new clang::index::CommentToXMLConverter();
38886cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko
3893e63d332baf0d3b8a5c0b7c2dac2ae85615b1d47Dmitri Gribenko  SmallString<1024> HTML;
39086cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  TU->CommentToXML
39186cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko      ->convertCommentToHTML(FC, HTML, cxtu::getASTUnit(TU)->getASTContext());
3925595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(HTML.str());
393ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko}
394ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko
395e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri GribenkoCXString clang_FullComment_getAsXML(CXComment CXC) {
396f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko  const FullComment *FC = getASTNodeAs<FullComment>(CXC);
397f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko  if (!FC)
398dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
39986cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko
400e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko  CXTranslationUnit TU = CXC.TranslationUnit;
40186cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  if (!TU->CommentToXML)
4024d0ddecbe7dbbfeb89e428ed6e19c3cf12325087Dmitri Gribenko    TU->CommentToXML = new clang::index::CommentToXMLConverter();
403f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko
404f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko  SmallString<1024> XML;
40586cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  TU->CommentToXML
40686cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko      ->convertCommentToXML(FC, XML, cxtu::getASTUnit(TU)->getASTContext());
4075595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko  return cxstring::createDup(XML.str());
408f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko}
409f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko
410f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko} // end extern "C"
411f303d4cb10648ac9c2080ae7c9dd507ba615e3a7Dmitri Gribenko
412