Comment.h revision 96b098674908eaa59a9128f3305cda6fbbdad563
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" 188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/ArrayRef.h" 198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/StringRef.h" 208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang { 228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments { 238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Any part of the comment. 258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass Comment { 278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Preferred location to show caret. 298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation Loc; 308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Source range of this AST node. 328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class CommentBitfields { 358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class Comment; 368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Type of this AST node. 388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned Kind : 8; 398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko enum { NumCommentBits = 8 }; 418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class InlineContentCommentBitfields { 438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class InlineContentComment; 448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned : NumCommentBits; 468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// True if there is a newline after this inline content node. 488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// (There is no separate AST node for a newline.) 498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned HasTrailingNewline : 1; 508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 510f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumInlineContentCommentBits = NumCommentBits + 1 }; 520f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 530f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko class TextCommentBitfields { 540f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko friend class TextComment; 550f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 560f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko unsigned : NumInlineContentCommentBits; 570f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 580f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if \c IsWhitespace field contains a valid value. 590f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespaceValid : 1; 600f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 610f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if this comment AST node contains only whitespace. 620f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespace : 1; 630f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko }; 640f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumTextCommentBits = NumInlineContentCommentBits + 2 }; 658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 662d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko class InlineCommandCommentBitfields { 672d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko friend class InlineCommandComment; 682d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 692d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko unsigned : NumInlineContentCommentBits; 702d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 712d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko unsigned RenderKind : 2; 722d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko }; 732d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko enum { NumInlineCommandCommentBits = NumInlineContentCommentBits + 1 }; 742d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 753f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko class HTMLStartTagCommentBitfields { 763f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko friend class HTMLStartTagComment; 77a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 78befceba36bb91f05dd36b06fae93e2539c944622Dmitri Gribenko unsigned : NumInlineContentCommentBits; 79a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 80a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// True if this tag is self-closing (e. g., <br />). This is based on tag 81a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// spelling in comment (plain <br> would not set this flag). 82a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned IsSelfClosing : 1; 83a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 848986e108e04a4fbe9248f87708410bb073940d7bDmitri Gribenko enum { NumHTMLStartTagCommentBits = NumInlineContentCommentBits + 1 }; 85a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 860f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko class ParagraphCommentBitfields { 870f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko friend class ParagraphComment; 880f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 890f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko unsigned : NumCommentBits; 900f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 910f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if \c IsWhitespace field contains a valid value. 920f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespaceValid : 1; 930f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 940f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if this comment AST node contains only whitespace. 950f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespace : 1; 960f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko }; 970f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumParagraphCommentBits = NumCommentBits + 2 }; 980f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class ParamCommandCommentBitfields { 1008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class ParamCommandComment; 1018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned : NumCommentBits; 1038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Parameter passing direction, see ParamCommandComment::PassDirection. 1058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned Direction : 2; 1068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// True if direction was specified explicitly in the comment. 1088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned IsDirectionExplicit : 1; 1098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 110befceba36bb91f05dd36b06fae93e2539c944622Dmitri Gribenko enum { NumParamCommandCommentBits = 11 }; 1118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko union { 1138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBitfields CommentBits; 1148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBitfields InlineContentCommentBits; 1150f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBitfields TextCommentBits; 1162d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineCommandCommentBitfields InlineCommandCommentBits; 1173f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBitfields HTMLStartTagCommentBits; 1180f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBitfields ParagraphCommentBits; 1198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBitfields ParamCommandCommentBits; 1208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setSourceRange(SourceRange SR) { 1238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range = SR; 1248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setLocation(SourceLocation L) { 1278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc = L; 1288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko enum CommentKind { 1328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NoCommentKind = 0, 1338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) CLASS##Kind, 1348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT_RANGE(BASE, FIRST, LAST) \ 1358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind, 1368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LAST_COMMENT_RANGE(BASE, FIRST, LAST) \ 1378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind 1388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) 1398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 1408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(CommentKind K, 1438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 1448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 1458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc(LocBegin), Range(SourceRange(LocBegin, LocEnd)) { 1468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBits.Kind = K; 1478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentKind getCommentKind() const { 1508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<CommentKind>(CommentBits.Kind); 1518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const char *getCommentKindName() const; 1548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump() const; 1568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump(SourceManager &SM) const; 157fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko void dump(llvm::raw_ostream &OS, SourceManager *SM) const; 1588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *) { return true; } 1608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getSourceRange() const LLVM_READONLY { return Range; } 1628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocStart() const LLVM_READONLY { 1648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getBegin(); 1658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocEnd() const LLVM_READONLY { 1688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getEnd(); 1698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocation() const LLVM_READONLY { return Loc; } 1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 173a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko typedef Comment * const *child_iterator; 174a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 1758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const; 1768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const; 1778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 178a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko // TODO: const child iterator 179a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 1808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned child_count() const { 1818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return child_end() - child_begin(); 1828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 1848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Inline content (contained within a block). 1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineContentComment : public Comment { 1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 1898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(CommentKind K, 1908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 1918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 1928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) { 1938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 0; 1948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 1988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstInlineContentCommentConstant && 1998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastInlineContentCommentConstant; 2008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const InlineContentComment *) { return true; } 2038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void addTrailingNewline() { 2058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 1; 2068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasTrailingNewline() const { 2098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return InlineContentCommentBits.HasTrailingNewline; 2108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Plain text. 2148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass TextComment : public InlineContentComment { 2158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextComment(SourceLocation LocBegin, 2198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 2208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 2218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(TextCommentKind, LocBegin, LocEnd), 2220f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko Text(Text) { 2230f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = false; 2240f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == TextCommentKind; 2288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const TextComment *) { return true; } 2318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 2338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 2358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { return Text; } 237a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 2380f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 2390f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (TextCommentBits.IsWhitespaceValid) 2400f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2410f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2420f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespace = isWhitespaceNoCache(); 2430f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = true; 2440f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2450f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2460f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2470f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 2480f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 2498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command with word-like arguments that is considered inline content. 2528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineCommandComment : public InlineContentComment { 2538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 25436cbfbfce889642057bd007eac3569ea9f58e1e8Dmitri Gribenko struct Argument { 2558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 2568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 2598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 2608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2612d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko /// The most appropriate rendering mode for this command, chosen on command 2622d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko /// semantics in Doxygen. 2632d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko enum RenderKind { 2642d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderNormal, 2652d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderBold, 2662d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderMonospaced, 2672d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderEmphasized 2682d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko }; 2692d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 2708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 2718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command name. 2728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 2738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command arguments. 2758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args; 2768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineCommandComment(SourceLocation LocBegin, 2798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 2808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name, 2812d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderKind RK, 2828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args) : 2832d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineContentComment(InlineCommandCommentKind, LocBegin, LocEnd), 2842d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko Name(Name), Args(Args) { 2852d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineCommandCommentBits.RenderKind = RK; 2862d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko } 2878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == InlineCommandCommentKind; 2908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const InlineCommandComment *) { return true; } 2938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 2958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 2978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCommandName() const { 2998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Name; 3008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getCommandNameRange() const { 3038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(getLocStart().getLocWithOffset(-1), 3048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocEnd()); 3058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3072d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderKind getRenderKind() const { 3082d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko return static_cast<RenderKind>(InlineCommandCommentBits.RenderKind); 3092d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko } 3102d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 3110eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 3128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 3138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 3168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 3178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 3208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 3218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 3238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class for opening and closing HTML tags. HTML tags are always 3258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// treated as inline content (regardless HTML semantics); opening and closing 3268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// tags are not matched. 3278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass HTMLTagComment : public InlineContentComment { 3288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 3298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName; 3308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange TagNameRange; 3318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko HTMLTagComment(CommentKind K, 3338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 3348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 3358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName, 3368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameBegin, 3378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameEnd) : 3388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(K, LocBegin, LocEnd), 3398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName(TagName), 3408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagNameRange(TagNameBegin, TagNameEnd) { 3418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(TagNameBegin); 3428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 3468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstHTMLTagCommentConstant && 3478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastHTMLTagCommentConstant; 3488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const HTMLTagComment *) { return true; } 3518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getTagName() const LLVM_READONLY { return TagName; } 3538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTagNameSourceRange() const LLVM_READONLY { 3558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = getLocation(); 3568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(L.getLocWithOffset(1), 3578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko L.getLocWithOffset(1 + TagName.size())); 3588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 3608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// An opening HTML tag with attributes. 3623f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLStartTagComment : public HTMLTagComment { 3638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class Attribute { 3658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public: 3668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NameLocBegin; 3678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 3688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc; 3708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange; 3728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Value; 3738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute() { } 3758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name) : 3778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 3788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(SourceLocation()), 3798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(SourceRange()), Value(StringRef()) 3808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 3818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name, 3838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc, 3848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange, StringRef Value) : 3858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 3868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(EqualsLoc), 3878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(ValueRange), Value(Value) 3888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 3898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getNameLocEnd() const { 3918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return NameLocBegin.getLocWithOffset(Name.size()); 3928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getNameRange() const { 3958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(NameLocBegin, getNameLocEnd()); 3968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 3988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprivate: 4008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ArrayRef<Attribute> Attributes; 4018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4033f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagComment(SourceLocation LocBegin, 4043f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 4053f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLStartTagCommentKind, 4068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocBegin.getLocWithOffset(1 + TagName.size()), 4078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 4088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(1), 409a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko LocBegin.getLocWithOffset(1 + TagName.size())) { 4103f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = false; 411a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 4128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4143f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLStartTagCommentKind; 4158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4173f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko static bool classof(const HTMLStartTagComment *) { return true; } 4188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 4208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 4228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4230eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumAttrs() const { 4248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes.size(); 4258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &getAttr(unsigned Idx) const { 4288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes[Idx]; 4298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setAttrs(ArrayRef<Attribute> Attrs) { 4328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attributes = Attrs; 4338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (!Attrs.empty()) { 4348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &Attr = Attrs.back(); 4358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = Attr.ValueRange.getEnd(); 4368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (L.isValid()) 4378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(L); 4388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko else { 4398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(Attr.getNameLocEnd()); 4408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setGreaterLoc(SourceLocation GreaterLoc) { 4458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(GreaterLoc); 4468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 447a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 448a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isSelfClosing() const { 4493f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return HTMLStartTagCommentBits.IsSelfClosing; 450a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 451a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 452a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setSelfClosing() { 4533f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = true; 454a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 4558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A closing HTML tag. 4583f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLEndTagComment : public HTMLTagComment { 4598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4603f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLEndTagComment(SourceLocation LocBegin, 4613f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko SourceLocation LocEnd, 4623f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 4633f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLEndTagCommentKind, 4648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 4658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 4668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2), 4678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2 + TagName.size())) 4688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4713f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLEndTagCommentKind; 4728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4743f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko static bool classof(const HTMLEndTagComment *) { return true; } 4758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 4778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 4798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Block content (contains inline content). 4828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 4838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockContentComment : public Comment { 4848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 4858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(CommentKind K, 4868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 4878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 4888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) 4898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstBlockContentCommentConstant && 4948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastBlockContentCommentConstant; 4958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const BlockContentComment *) { return true; } 4988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A single paragraph that contains inline content. 5018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParagraphComment : public BlockContentComment { 5028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<InlineContentComment *> Content; 5038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment(llvm::ArrayRef<InlineContentComment *> Content) : 5068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(ParagraphCommentKind, 5078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation(), 5088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation()), 5098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content(Content) { 5100f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (Content.empty()) { 5110f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = true; 5120f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 5138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 5140f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 5150f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5160f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = false; 5178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Content.front()->getLocStart(), 5198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content.back()->getLocEnd())); 5208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Content.front()->getLocStart()); 5218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 5248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParagraphCommentKind; 5258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const ParagraphComment *) { return true; } 5288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 5308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.begin()); 5318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 5348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.end()); 5358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 536a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 5370f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 5380f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (ParagraphCommentBits.IsWhitespaceValid) 5390f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5400f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5410f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = isWhitespaceNoCache(); 5420f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 5430f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5440f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 5450f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5460f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 5470f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 5488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 5498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command that has zero or more word-like arguments (number of word-like 5518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// arguments depends on command name) and a paragraph as an argument 5528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (e. g., \\brief). 5538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockCommandComment : public BlockContentComment { 5548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko struct Argument { 5568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 5578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 5588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument() { } 5608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 5618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 5628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 5648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command name. 5658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 5668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 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, 5768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 5778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(K, LocBegin, LocEnd), 5788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Name(Name), 5798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph(NULL) { 5808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(getCommandNameRange().getBegin()); 5818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(SourceLocation LocBegin, 5858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 5868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 5878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd), 5888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Name(Name), 5898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph(NULL) { 5908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(getCommandNameRange().getBegin()); 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 static bool classof(const BlockCommandComment *) { return true; } 5998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 6018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph); 6028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 6058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph + 1); 6068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCommandName() const { 6098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Name; 6108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getCommandNameRange() const { 6138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(getLocStart().getLocWithOffset(1), 6148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocStart().getLocWithOffset(1 + Name.size())); 6158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6170eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 6188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 6198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 6228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 6238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 6268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 6278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setArgs(llvm::ArrayRef<Argument> A) { 6308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Args = A; 631a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (Args.size() > 0) { 632a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko SourceLocation NewLocEnd = Args.back().Range.getEnd(); 633a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (NewLocEnd.isValid()) 634a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 635a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 6368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment *getParagraph() const LLVM_READONLY { 6398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Paragraph; 6408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 642ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko bool hasNonWhitespaceParagraph() const { 643ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko return Paragraph && !Paragraph->isWhitespace(); 644ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko } 645ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko 6468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setParagraph(ParagraphComment *PC) { 6478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph = PC; 6488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NewLocEnd = PC->getLocEnd(); 6498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (NewLocEnd.isValid()) 6508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 6518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 6538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Doxygen \\param command. 6558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParamCommandComment : public BlockCommandComment { 656a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoprivate: 657a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// Parameter index in the function declaration. 658a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned ParamIndex; 6598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 661a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko enum { InvalidParamIndex = ~0U }; 662a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 6638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandComment(SourceLocation LocBegin, 6648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 6658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 666a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko BlockCommandComment(ParamCommandCommentKind, LocBegin, LocEnd, Name), 667a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex(InvalidParamIndex) { 6688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = In; 6698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = false; 6708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 6738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParamCommandCommentKind; 6748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const ParamCommandComment *) { return true; } 6778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 678a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko enum PassDirection { 679a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko In, 680a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko Out, 681a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko InOut 682a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 683a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 684a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko static const char *getDirectionAsString(PassDirection D); 685a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 6868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko PassDirection getDirection() const LLVM_READONLY { 6878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<PassDirection>(ParamCommandCommentBits.Direction); 6888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool isDirectionExplicit() const LLVM_READONLY { 6918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return ParamCommandCommentBits.IsDirectionExplicit; 6928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setDirection(PassDirection Direction, bool Explicit) { 6958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = Direction; 6968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = Explicit; 6978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasParamName() const { 7000eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko return getNumArgs() > 0; 7018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getParamName() const { 7048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[0].Text; 7058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getParamNameRange() const { 7088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[0].Range; 7098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 710a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 711a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isParamIndexValid() const LLVM_READONLY { 712a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex != InvalidParamIndex; 713a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 714a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 715a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned getParamIndex() const LLVM_READONLY { 716b740316a122b5ceaaa7cf50557b1b39af5fbbf5fDmitri Gribenko assert(isParamIndexValid()); 717a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex; 718a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 719a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 720a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setParamIndex(unsigned Index) { 721a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex = Index; 722a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko assert(isParamIndexValid()); 723a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 7248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 7258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 72696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko/// Doxygen \\tparam command, describes a template parameter. 72796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkoclass TParamCommandComment : public BlockCommandComment { 72896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkoprivate: 72996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// If this template parameter name was resolved (found in template parameter 73096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// list), then this stores a list of position indexes in all template 73196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// parameter lists. 73296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// 73396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For example: 73496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// \verbatim 73596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// template<typename C, template<typename T> class TT> 73696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// void test(TT<int> aaa); 73796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// \endverbatim 73896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For C: Position = { 0 } 73996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For TT: Position = { 1 } 74096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For T: Position = { 1, 0 } 74196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko llvm::ArrayRef<unsigned> Position; 74296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 74396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkopublic: 74496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko TParamCommandComment(SourceLocation LocBegin, 74596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko SourceLocation LocEnd, 74696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko StringRef Name) : 74796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko BlockCommandComment(TParamCommandCommentKind, LocBegin, LocEnd, Name) 74896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko { } 74996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 75096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko static bool classof(const Comment *C) { 75196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return C->getCommentKind() == TParamCommandCommentKind; 75296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 75396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 75496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko static bool classof(const TParamCommandComment *) { return true; } 75596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 75696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko bool hasParamName() const { 75796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return getNumArgs() > 0; 75896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 75996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 76096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko StringRef getParamName() const { 76196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return Args[0].Text; 76296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 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 static bool classof(const VerbatimBlockLineComment *) { return true; } 8068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 8088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 8108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { 8128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 8138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 8158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 816d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim block command (e. g., preformatted code). Verbatim block has an 817d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// opening and a closing command and contains multiple lines of text 8188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (VerbatimBlockLineComment nodes). 8198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimBlockComment : public BlockCommandComment { 8208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 8218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef CloseName; 8228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation CloseNameLocBegin; 8238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<VerbatimBlockLineComment *> Lines; 8248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 8268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockComment(SourceLocation LocBegin, 8278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 8288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 8298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimBlockCommentKind, 8308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, Name) 8318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 8328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimBlockCommentKind; 8358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const VerbatimBlockComment *) { return true; } 8388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 8408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.begin()); 8418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 8448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.end()); 8458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setCloseName(StringRef Name, SourceLocation LocBegin) { 8488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseName = Name; 8498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseNameLocBegin = LocBegin; 8508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setLines(llvm::ArrayRef<VerbatimBlockLineComment *> L) { 8538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Lines = L; 8548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCloseName() const { 8578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return CloseName; 8588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8600eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumLines() const { 8618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines.size(); 8628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText(unsigned LineIdx) const { 8658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines[LineIdx]->getText(); 8668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 8688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 869d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim line command. Verbatim line has an opening command, a single 870d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// line of text (up to the newline after the opening command) and has no 871d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// closing command. 8728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimLineComment : public BlockCommandComment { 8738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 8748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 8758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin; 8768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 8788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimLineComment(SourceLocation LocBegin, 8798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 8808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name, 8818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin, 8828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 8838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimLineCommentKind, 8848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 8858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Name), 8868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Text(Text), 8878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextBegin(TextBegin) 8888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 8898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimLineCommentKind; 8928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const VerbatimLineComment *) { return true; } 8958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 8978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 8998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const { 9018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 9028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTextRange() const { 9058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(TextBegin, getLocEnd()); 9068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 9088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A full comment attached to a declaration, contains block content. 9108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass FullComment : public Comment { 9118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<BlockContentComment *> Blocks; 9128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 9148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko FullComment(llvm::ArrayRef<BlockContentComment *> Blocks) : 9158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(FullCommentKind, SourceLocation(), SourceLocation()), 9168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Blocks(Blocks) { 9178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Blocks.empty()) 9188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 9198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Blocks.front()->getLocStart(), 9218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Blocks.back()->getLocEnd())); 9228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Blocks.front()->getLocStart()); 9238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 9268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == FullCommentKind; 9278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const FullComment *) { return true; } 9308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 9328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Blocks.begin()); 9338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 9368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Blocks.end()); 9378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 9398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments 9418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang 9428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif 9448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 945