Comment.h revision 6553c686cb419b22b4c79d05a422fb1e96f6e122
18d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===--- Comment.h - Comment AST nodes --------------------------*- C++ -*-===// 28d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 38d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// The LLVM Compiler Infrastructure 48d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 58d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// This file is distributed under the University of Illinois Open Source 68d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// License. See LICENSE.TXT for details. 78d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 88d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===// 98d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// This file defines comment AST nodes. 118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko// 128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko//===----------------------------------------------------------------------===// 138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#ifndef LLVM_CLANG_AST_COMMENT_H 158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LLVM_CLANG_AST_COMMENT_H 168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/Basic/SourceLocation.h" 1889ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko#include "clang/AST/Type.h" 19e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "clang/AST/CommentCommandTraits.h" 20bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian#include "clang/AST/DeclObjC.h" 218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/ArrayRef.h" 228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/StringRef.h" 238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang { 251ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkoclass Decl; 261ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkoclass ParmVarDecl; 271ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkoclass TemplateParameterList; 281ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments { 30749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanianclass FullComment; 318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Any part of the comment. 328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass Comment { 348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Preferred location to show caret. 368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation Loc; 378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Source range of this AST node. 398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class CommentBitfields { 428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class Comment; 438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Type of this AST node. 458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned Kind : 8; 468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko enum { NumCommentBits = 8 }; 488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class InlineContentCommentBitfields { 508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class InlineContentComment; 518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned : NumCommentBits; 538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// True if there is a newline after this inline content node. 558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// (There is no separate AST node for a newline.) 568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned HasTrailingNewline : 1; 578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 580f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumInlineContentCommentBits = NumCommentBits + 1 }; 590f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 600f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko class TextCommentBitfields { 610f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko friend class TextComment; 620f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 630f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko unsigned : NumInlineContentCommentBits; 640f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 650f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if \c IsWhitespace field contains a valid value. 660f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespaceValid : 1; 670f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 680f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if this comment AST node contains only whitespace. 690f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespace : 1; 700f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko }; 710f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumTextCommentBits = NumInlineContentCommentBits + 2 }; 728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 732d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko class InlineCommandCommentBitfields { 742d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko friend class InlineCommandComment; 752d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 762d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko unsigned : NumInlineContentCommentBits; 772d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 782d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko unsigned RenderKind : 2; 79e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID : 8; 802d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko }; 81e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko enum { NumInlineCommandCommentBits = NumInlineContentCommentBits + 10 }; 822d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 833f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko class HTMLStartTagCommentBitfields { 843f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko friend class HTMLStartTagComment; 85a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 86befceba36bb91f05dd36b06fae93e2539c944622Dmitri Gribenko unsigned : NumInlineContentCommentBits; 87a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 88a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// True if this tag is self-closing (e. g., <br />). This is based on tag 89a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// spelling in comment (plain <br> would not set this flag). 90a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned IsSelfClosing : 1; 91a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 928986e108e04a4fbe9248f87708410bb073940d7bDmitri Gribenko enum { NumHTMLStartTagCommentBits = NumInlineContentCommentBits + 1 }; 93a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 940f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko class ParagraphCommentBitfields { 950f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko friend class ParagraphComment; 960f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 970f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko unsigned : NumCommentBits; 980f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 990f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if \c IsWhitespace field contains a valid value. 1000f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespaceValid : 1; 1010f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 1020f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if this comment AST node contains only whitespace. 1030f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespace : 1; 1040f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko }; 1050f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumParagraphCommentBits = NumCommentBits + 2 }; 1060f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 107e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko class BlockCommandCommentBitfields { 108e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko friend class BlockCommandComment; 109e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 110e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned : NumCommentBits; 111e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 112e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID : 8; 113e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko }; 114e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko enum { NumBlockCommandCommentBits = NumCommentBits + 8 }; 115e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 1168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class ParamCommandCommentBitfields { 1178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class ParamCommandComment; 1188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 119e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned : NumBlockCommandCommentBits; 1208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Parameter passing direction, see ParamCommandComment::PassDirection. 1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned Direction : 2; 1238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// True if direction was specified explicitly in the comment. 1258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned IsDirectionExplicit : 1; 1268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 127e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko enum { NumParamCommandCommentBits = NumBlockCommandCommentBits + 3 }; 1288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko union { 1308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBitfields CommentBits; 1318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBitfields InlineContentCommentBits; 1320f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBitfields TextCommentBits; 1332d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineCommandCommentBitfields InlineCommandCommentBits; 1343f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBitfields HTMLStartTagCommentBits; 1350f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBitfields ParagraphCommentBits; 136e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandCommentBitfields BlockCommandCommentBits; 1378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBitfields ParamCommandCommentBits; 1388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setSourceRange(SourceRange SR) { 1418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range = SR; 1428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setLocation(SourceLocation L) { 1458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc = L; 1468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko enum CommentKind { 1508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NoCommentKind = 0, 1518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) CLASS##Kind, 1528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT_RANGE(BASE, FIRST, LAST) \ 1538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind, 1548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LAST_COMMENT_RANGE(BASE, FIRST, LAST) \ 1558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind 1568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) 1578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 1588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(CommentKind K, 1618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 1628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 1638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc(LocBegin), Range(SourceRange(LocBegin, LocEnd)) { 1648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBits.Kind = K; 1658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentKind getCommentKind() const { 1688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<CommentKind>(CommentBits.Kind); 1698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const char *getCommentKindName() const; 1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump() const; 174e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump(const ASTContext &Context) const; 175e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko void dump(llvm::raw_ostream &OS, const CommandTraits *Traits, 176e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const SourceManager *SM) const; 1778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getSourceRange() const LLVM_READONLY { return Range; } 1798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocStart() const LLVM_READONLY { 1818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getBegin(); 1828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocEnd() const LLVM_READONLY { 1858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getEnd(); 1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocation() const LLVM_READONLY { return Loc; } 1898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 190a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko typedef Comment * const *child_iterator; 191a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 1928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const; 1938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const; 1948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 195a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko // TODO: const child iterator 196a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 1978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned child_count() const { 1988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return child_end() - child_begin(); 1998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Inline content (contained within a block). 2038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 2048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineContentComment : public Comment { 2058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 2068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(CommentKind K, 2078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 2088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 2098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) { 2108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 0; 2118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstInlineContentCommentConstant && 2168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastInlineContentCommentConstant; 2178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void addTrailingNewline() { 2208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 1; 2218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasTrailingNewline() const { 2248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return InlineContentCommentBits.HasTrailingNewline; 2258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Plain text. 2298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass TextComment : public InlineContentComment { 2308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextComment(SourceLocation LocBegin, 2348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 2358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 2368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(TextCommentKind, LocBegin, LocEnd), 2370f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko Text(Text) { 2380f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = false; 2390f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == TextCommentKind; 2438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 2468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 2488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { return Text; } 250a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 2510f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 2520f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (TextCommentBits.IsWhitespaceValid) 2530f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2540f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2550f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespace = isWhitespaceNoCache(); 2560f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = true; 2570f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2580f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2590f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2600f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 2610f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 2628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command with word-like arguments that is considered inline content. 2658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineCommandComment : public InlineContentComment { 2668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 26736cbfbfce889642057bd007eac3569ea9f58e1e8Dmitri Gribenko struct Argument { 2688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 2698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 2728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 2738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2742d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko /// The most appropriate rendering mode for this command, chosen on command 2752d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko /// semantics in Doxygen. 2762d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko enum RenderKind { 2772d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderNormal, 2782d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderBold, 2792d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderMonospaced, 2802d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderEmphasized 2812d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko }; 2822d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 2838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 2848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command arguments. 2858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args; 2868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineCommandComment(SourceLocation LocBegin, 2898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 290e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID, 2912d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderKind RK, 2928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args) : 2932d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineContentComment(InlineCommandCommentKind, LocBegin, LocEnd), 294e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko Args(Args) { 2952d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineCommandCommentBits.RenderKind = RK; 296e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko InlineCommandCommentBits.CommandID = CommandID; 2972d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko } 2988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 3008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == InlineCommandCommentKind; 3018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 3048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 3068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 307e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned getCommandID() const { 308e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return InlineCommandCommentBits.CommandID; 309e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 310e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 311e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef getCommandName(const CommandTraits &Traits) const { 312e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Traits.getCommandInfo(getCommandID())->Name; 3138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getCommandNameRange() const { 3168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(getLocStart().getLocWithOffset(-1), 3178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocEnd()); 3188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3202d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderKind getRenderKind() const { 3212d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko return static_cast<RenderKind>(InlineCommandCommentBits.RenderKind); 3222d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko } 3232d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 3240eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 3258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 3268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 3298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 3308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 3338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 3348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 3368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class for opening and closing HTML tags. HTML tags are always 3388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// treated as inline content (regardless HTML semantics); opening and closing 3398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// tags are not matched. 3408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass HTMLTagComment : public InlineContentComment { 3418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 3428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName; 3438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange TagNameRange; 3448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko HTMLTagComment(CommentKind K, 3468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 3478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 3488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName, 3498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameBegin, 3508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameEnd) : 3518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(K, LocBegin, LocEnd), 3528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName(TagName), 3538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagNameRange(TagNameBegin, TagNameEnd) { 3548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(TagNameBegin); 3558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 3598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstHTMLTagCommentConstant && 3608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastHTMLTagCommentConstant; 3618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getTagName() const LLVM_READONLY { return TagName; } 3648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTagNameSourceRange() const LLVM_READONLY { 3668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = getLocation(); 3678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(L.getLocWithOffset(1), 3688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko L.getLocWithOffset(1 + TagName.size())); 3698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 3718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// An opening HTML tag with attributes. 3733f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLStartTagComment : public HTMLTagComment { 3748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class Attribute { 3768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public: 3778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NameLocBegin; 3788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 3798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc; 3818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange; 3838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Value; 3848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute() { } 3868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name) : 3888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 3898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(SourceLocation()), 3908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(SourceRange()), Value(StringRef()) 3918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 3928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name, 3948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc, 3958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange, StringRef Value) : 3968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 3978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(EqualsLoc), 3988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(ValueRange), Value(Value) 3998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getNameLocEnd() const { 4028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return NameLocBegin.getLocWithOffset(Name.size()); 4038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getNameRange() const { 4068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(NameLocBegin, getNameLocEnd()); 4078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 4098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprivate: 4118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ArrayRef<Attribute> Attributes; 4128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4143f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagComment(SourceLocation LocBegin, 4153f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 4163f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLStartTagCommentKind, 4178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocBegin.getLocWithOffset(1 + TagName.size()), 4188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 4198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(1), 420a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko LocBegin.getLocWithOffset(1 + TagName.size())) { 4213f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = false; 422a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 4238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4253f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLStartTagCommentKind; 4268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 4298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 4318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4320eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumAttrs() const { 4338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes.size(); 4348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &getAttr(unsigned Idx) const { 4378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes[Idx]; 4388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setAttrs(ArrayRef<Attribute> Attrs) { 4418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attributes = Attrs; 4428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (!Attrs.empty()) { 4438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &Attr = Attrs.back(); 4448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = Attr.ValueRange.getEnd(); 4458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (L.isValid()) 4468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(L); 4478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko else { 4488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(Attr.getNameLocEnd()); 4498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setGreaterLoc(SourceLocation GreaterLoc) { 4548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(GreaterLoc); 4558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 456a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 457a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isSelfClosing() const { 4583f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return HTMLStartTagCommentBits.IsSelfClosing; 459a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 460a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 461a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setSelfClosing() { 4623f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = true; 463a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 4648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A closing HTML tag. 4673f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLEndTagComment : public HTMLTagComment { 4688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4693f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLEndTagComment(SourceLocation LocBegin, 4703f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko SourceLocation LocEnd, 4713f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 4723f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLEndTagCommentKind, 4738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 4748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 4758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2), 4768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2 + TagName.size())) 4778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4803f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLEndTagCommentKind; 4818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 4848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 4868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Block content (contains inline content). 4898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 4908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockContentComment : public Comment { 4918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 4928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(CommentKind K, 4938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 4948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 4958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) 4968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 5008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstBlockContentCommentConstant && 5018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastBlockContentCommentConstant; 5028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 5048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A single paragraph that contains inline content. 5068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParagraphComment : public BlockContentComment { 5078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<InlineContentComment *> Content; 5088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment(llvm::ArrayRef<InlineContentComment *> Content) : 5118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(ParagraphCommentKind, 5128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation(), 5138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation()), 5148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content(Content) { 5150f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (Content.empty()) { 5160f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = true; 5170f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 5188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 5190f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 5200f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5210f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = false; 5228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Content.front()->getLocStart(), 5248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content.back()->getLocEnd())); 5258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Content.front()->getLocStart()); 5268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 5298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParagraphCommentKind; 5308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 5338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.begin()); 5348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 5378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.end()); 5388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 539a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 5400f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 5410f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (ParagraphCommentBits.IsWhitespaceValid) 5420f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5430f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5440f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = isWhitespaceNoCache(); 5450f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 5460f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5470f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 5480f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5490f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 5500f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 5518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 5528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command that has zero or more word-like arguments (number of word-like 5548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// arguments depends on command name) and a paragraph as an argument 5558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (e. g., \\brief). 5568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockCommandComment : public BlockContentComment { 5578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko struct Argument { 5598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 5608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 5618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument() { } 5638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 5648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 5658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 5678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Word-like arguments. 5688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args; 5698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Paragraph argument. 5718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment *Paragraph; 5728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(CommentKind K, 5748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 5758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 576e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) : 5778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(K, LocBegin, LocEnd), 5788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph(NULL) { 579e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko setLocation(getCommandNameBeginLoc()); 580e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandCommentBits.CommandID = CommandID; 5818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(SourceLocation LocBegin, 5858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 586e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) : 5878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd), 5888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph(NULL) { 589e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko setLocation(getCommandNameBeginLoc()); 590e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandCommentBits.CommandID = CommandID; 5918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 594beef1cb6ebfaea4542fb6d6686caae27787a75e0Dmitri Gribenko return C->getCommentKind() >= FirstBlockCommandCommentConstant && 595beef1cb6ebfaea4542fb6d6686caae27787a75e0Dmitri Gribenko C->getCommentKind() <= LastBlockCommandCommentConstant; 5968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 5998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph); 6008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 6038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph + 1); 6048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 606e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned getCommandID() const { 607e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return BlockCommandCommentBits.CommandID; 6088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 610e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef getCommandName(const CommandTraits &Traits) const { 611e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Traits.getCommandInfo(getCommandID())->Name; 612e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 613e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 614e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko SourceLocation getCommandNameBeginLoc() const { 615e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return getLocStart().getLocWithOffset(1); 616e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 617e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 618e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko SourceRange getCommandNameRange(const CommandTraits &Traits) const { 619e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef Name = getCommandName(Traits); 620e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return SourceRange(getCommandNameBeginLoc(), 6218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocStart().getLocWithOffset(1 + Name.size())); 6228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6240eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 6258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 6268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 6298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 6308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 6338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 6348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setArgs(llvm::ArrayRef<Argument> A) { 6378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Args = A; 638a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (Args.size() > 0) { 639a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko SourceLocation NewLocEnd = Args.back().Range.getEnd(); 640a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (NewLocEnd.isValid()) 641a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 642a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 6438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment *getParagraph() const LLVM_READONLY { 6468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Paragraph; 6478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 649ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko bool hasNonWhitespaceParagraph() const { 650ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko return Paragraph && !Paragraph->isWhitespace(); 651ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko } 652ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko 6538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setParagraph(ParagraphComment *PC) { 6548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph = PC; 6558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NewLocEnd = PC->getLocEnd(); 6568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (NewLocEnd.isValid()) 6578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 6588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 6608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Doxygen \\param command. 6628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParamCommandComment : public BlockCommandComment { 663a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoprivate: 664a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// Parameter index in the function declaration. 665a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned ParamIndex; 6668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 668a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko enum { InvalidParamIndex = ~0U }; 669a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 6708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandComment(SourceLocation LocBegin, 6718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 672e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) : 673e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandComment(ParamCommandCommentKind, LocBegin, LocEnd, 674e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko CommandID), 675a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex(InvalidParamIndex) { 6768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = In; 6778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = false; 6788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 6818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParamCommandCommentKind; 6828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 684a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko enum PassDirection { 685a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko In, 686a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko Out, 687a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko InOut 688a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 689a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 690a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko static const char *getDirectionAsString(PassDirection D); 691a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 6928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko PassDirection getDirection() const LLVM_READONLY { 6938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<PassDirection>(ParamCommandCommentBits.Direction); 6948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool isDirectionExplicit() const LLVM_READONLY { 6978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return ParamCommandCommentBits.IsDirectionExplicit; 6988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setDirection(PassDirection Direction, bool Explicit) { 7018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = Direction; 7028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = Explicit; 7038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasParamName() const { 7060eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko return getNumArgs() > 0; 7078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 709749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian StringRef getParamName(comments::FullComment *FC) const; 7108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getParamNameRange() const { 7128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[0].Range; 7138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 714a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 715a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isParamIndexValid() const LLVM_READONLY { 716a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex != InvalidParamIndex; 717a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 718a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 719a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned getParamIndex() const LLVM_READONLY { 720b740316a122b5ceaaa7cf50557b1b39af5fbbf5fDmitri Gribenko assert(isParamIndexValid()); 721a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex; 722a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 723a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 724a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setParamIndex(unsigned Index) { 725a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex = Index; 726a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko assert(isParamIndexValid()); 727a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 7288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 7298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 73096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko/// Doxygen \\tparam command, describes a template parameter. 73196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkoclass TParamCommandComment : public BlockCommandComment { 73296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkoprivate: 73396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// If this template parameter name was resolved (found in template parameter 73496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// list), then this stores a list of position indexes in all template 73596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// parameter lists. 73696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// 73796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For example: 73896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// \verbatim 73996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// template<typename C, template<typename T> class TT> 74096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// void test(TT<int> aaa); 74196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// \endverbatim 74296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For C: Position = { 0 } 74396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For TT: Position = { 1 } 74496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For T: Position = { 1, 0 } 74596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko llvm::ArrayRef<unsigned> Position; 74696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 74796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkopublic: 74896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko TParamCommandComment(SourceLocation LocBegin, 74996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko SourceLocation LocEnd, 750e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) : 751e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandComment(TParamCommandCommentKind, LocBegin, LocEnd, CommandID) 75296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko { } 75396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 75496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko static bool classof(const Comment *C) { 75596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return C->getCommentKind() == TParamCommandCommentKind; 75696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 75796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 75896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko bool hasParamName() const { 75996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return getNumArgs() > 0; 76096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 76196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 7626553c686cb419b22b4c79d05a422fb1e96f6e122Fariborz Jahanian StringRef getParamName(comments::FullComment *FC) const; 76396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 76496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko SourceRange getParamNameRange() const { 76596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return Args[0].Range; 76696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 76796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 76896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko bool isPositionValid() const LLVM_READONLY { 76996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return !Position.empty(); 77096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 77196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 77296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko unsigned getDepth() const { 77396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko assert(isPositionValid()); 77496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return Position.size(); 77596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 77696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 77796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko unsigned getIndex(unsigned Depth) const { 77896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko assert(isPositionValid()); 77996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return Position[Depth]; 78096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 78196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 78296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko void setPosition(ArrayRef<unsigned> NewPosition) { 78396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko Position = NewPosition; 78496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko assert(isPositionValid()); 78596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 78696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko}; 78796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 7888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A line of text contained in a verbatim block. 7898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimBlockLineComment : public Comment { 7908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 7918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 7938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockLineComment(SourceLocation LocBegin, 7948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 7958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(VerbatimBlockLineCommentKind, 7968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, 7978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(Text.size())), 7988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Text(Text) 7998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 8008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimBlockLineCommentKind; 8038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 8068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 8088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { 8108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 8118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 8138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 814d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim block command (e. g., preformatted code). Verbatim block has an 815d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// opening and a closing command and contains multiple lines of text 8168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (VerbatimBlockLineComment nodes). 8178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimBlockComment : public BlockCommandComment { 8188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 8198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef CloseName; 8208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation CloseNameLocBegin; 8218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<VerbatimBlockLineComment *> Lines; 8228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 8248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockComment(SourceLocation LocBegin, 8258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 826e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) : 8278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimBlockCommentKind, 828e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko LocBegin, LocEnd, CommandID) 8298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 8308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimBlockCommentKind; 8338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 8368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.begin()); 8378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 8408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.end()); 8418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setCloseName(StringRef Name, SourceLocation LocBegin) { 8448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseName = Name; 8458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseNameLocBegin = LocBegin; 8468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setLines(llvm::ArrayRef<VerbatimBlockLineComment *> L) { 8498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Lines = L; 8508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCloseName() const { 8538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return CloseName; 8548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8560eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumLines() const { 8578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines.size(); 8588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText(unsigned LineIdx) const { 8618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines[LineIdx]->getText(); 8628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 8648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 865d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim line command. Verbatim line has an opening command, a single 866d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// line of text (up to the newline after the opening command) and has no 867d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// closing command. 8688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimLineComment : public BlockCommandComment { 8698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 8708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 8718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin; 8728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 8748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimLineComment(SourceLocation LocBegin, 8758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 876e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID, 8778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin, 8788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 8798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimLineCommentKind, 8808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 881e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko CommandID), 8828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Text(Text), 8838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextBegin(TextBegin) 8848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 8858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimLineCommentKind; 8888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 8918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 8938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const { 8958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 8968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTextRange() const { 8998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(TextBegin, getLocEnd()); 9008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 9028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9031ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko/// Information about the declaration, useful to clients of FullComment. 9041ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkostruct DeclInfo { 9051ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// Declaration the comment is attached to. Should not be NULL. 906bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian const Decl *CommentDecl; 907bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 908bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Parameters that can be referenced by \\param if \c CommentDecl is something 9091ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// that we consider a "function". 9101ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko ArrayRef<const ParmVarDecl *> ParamVars; 9111ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 912bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Function result type if \c CommentDecl is something that we consider 91389ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko /// a "function". 91489ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko QualType ResultType; 91589ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko 916bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Template parameters that can be referenced by \\tparam if \c CommentDecl is 91704bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko /// a template (\c IsTemplateDecl or \c IsTemplatePartialSpecialization is 91804bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko /// true). 9191ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko const TemplateParameterList *TemplateParameters; 9201ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 921bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// A simplified description of \c CommentDecl kind that should be good enough 922af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// for documentation rendering purposes. 923af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko enum DeclKind { 92489ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko /// Everything else not explicitly mentioned below. 92589ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko OtherKind, 92689ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko 927af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// Something that we consider a "function": 928af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li function, 929af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li function template, 930af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li function template specialization, 931af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li member function, 932af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li member function template, 933af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li member function template specialization, 93470ff1091315c60fed68d7197c637ec8c588e67a1Dmitri Gribenko /// \li ObjC method, 93570ff1091315c60fed68d7197c637ec8c588e67a1Dmitri Gribenko /// \li a typedef for a function pointer, member function pointer, 93670ff1091315c60fed68d7197c637ec8c588e67a1Dmitri Gribenko /// ObjC block. 937af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko FunctionKind, 938af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 939af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// Something that we consider a "class": 940af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li class/struct, 941af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li class template, 942af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li class template (partial) specialization. 943af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko ClassKind, 944af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 945af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// Something that we consider a "variable": 946af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li namespace scope variables; 947dd7b803e6ce5b8e61cf3b14af2c57199e5e991d9Dmitri Gribenko /// \li static and non-static class data members; 94816bec0630ef488af263d521b166b41ffa3c71743Dmitri Gribenko /// \li enumerators. 949af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko VariableKind, 950af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 951af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// A C++ namespace. 952af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko NamespaceKind, 953af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 954af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// A C++ typedef-name (a 'typedef' decl specifier or alias-declaration), 955af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// see \c TypedefNameDecl. 956cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko TypedefKind, 957cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko 958cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko /// An enumeration or scoped enumeration. 959cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko EnumKind 960af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko }; 961af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 962bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// What kind of template specialization \c CommentDecl is. 96304bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko enum TemplateDeclKind { 96404bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko NotTemplate, 96504bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko Template, 96604bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko TemplateSpecialization, 96704bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko TemplatePartialSpecialization 96804bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko }; 96904bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko 970bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// If false, only \c CommentDecl is valid. 9711ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko unsigned IsFilled : 1; 9721ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 973bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Simplified kind of \c CommentDecl, see\c DeclKind enum. 974af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko unsigned Kind : 3; 9751ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 976bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Is \c CommentDecl a template declaration. 97704bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko unsigned TemplateKind : 2; 9781ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 979bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Is \c CommentDecl an ObjCMethodDecl. 98088815f3f81361692dd281000e3e46bf163b2f28bDmitri Gribenko unsigned IsObjCMethod : 1; 98188815f3f81361692dd281000e3e46bf163b2f28bDmitri Gribenko 9821ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// Is \c ThisDecl a non-static member function of C++ class or 9831ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// instance method of ObjC class. 9841ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// Can be true only if \c IsFunctionDecl is true. 9851ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko unsigned IsInstanceMethod : 1; 9861ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 987bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Is \c CommentDecl a static member function of C++ class or 9881ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// class method of ObjC class. 9891ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// Can be true only if \c IsFunctionDecl is true. 9901ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko unsigned IsClassMethod : 1; 9911ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 9921ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko void fill(); 993af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 994af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko DeclKind getKind() const LLVM_READONLY { 995af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko return static_cast<DeclKind>(Kind); 996af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko } 99704bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko 99804bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko TemplateDeclKind getTemplateKind() const LLVM_READONLY { 99904bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko return static_cast<TemplateDeclKind>(TemplateKind); 100004bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko } 10011ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko}; 10021ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 10038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A full comment attached to a declaration, contains block content. 10048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass FullComment : public Comment { 10058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<BlockContentComment *> Blocks; 10061ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko DeclInfo *ThisDeclInfo; 10071ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 10088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1009749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian FullComment(llvm::ArrayRef<BlockContentComment *> Blocks, DeclInfo *D) : 10108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(FullCommentKind, SourceLocation(), SourceLocation()), 1011749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian Blocks(Blocks), ThisDeclInfo(D) { 10128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Blocks.empty()) 10138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 10148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Blocks.front()->getLocStart(), 10168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Blocks.back()->getLocEnd())); 10178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Blocks.front()->getLocStart()); 10188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 10198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 10218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == FullCommentKind; 10228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 10238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 10258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Blocks.begin()); 10268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 10278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 1029749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian return reinterpret_cast<child_iterator>(Blocks.end()); 10308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 10311ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 10321ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko const Decl *getDecl() const LLVM_READONLY { 1033bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian return ThisDeclInfo->CommentDecl; 10341ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko } 1035bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 10361ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko const DeclInfo *getDeclInfo() const LLVM_READONLY { 10371ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko if (!ThisDeclInfo->IsFilled) 10381ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko ThisDeclInfo->fill(); 10391ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko return ThisDeclInfo; 10401ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko } 1041bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 1042bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian DeclInfo *getThisDeclInfo() const LLVM_READONLY { 1043bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian return ThisDeclInfo; 1044bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian } 1045bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 1046bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian llvm::ArrayRef<BlockContentComment *> getBlocks() const { return Blocks; } 1047bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 10488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 10498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments 10508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang 10518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif 10538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1054