Comment.h revision 0f7f10bd0ea08abf56c69fea9316275a1ee0e40c
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 663f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko class HTMLStartTagCommentBitfields { 673f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko friend class HTMLStartTagComment; 68a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 69befceba36bb91f05dd36b06fae93e2539c944622Dmitri Gribenko unsigned : NumInlineContentCommentBits; 70a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 71a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// True if this tag is self-closing (e. g., <br />). This is based on tag 72a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// spelling in comment (plain <br> would not set this flag). 73a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned IsSelfClosing : 1; 74a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 75a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 760f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko class ParagraphCommentBitfields { 770f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko friend class ParagraphComment; 780f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 790f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko unsigned : NumCommentBits; 800f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 810f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if \c IsWhitespace field contains a valid value. 820f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespaceValid : 1; 830f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 840f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if this comment AST node contains only whitespace. 850f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespace : 1; 860f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko }; 870f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumParagraphCommentBits = NumCommentBits + 2 }; 880f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class ParamCommandCommentBitfields { 908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class ParamCommandComment; 918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned : NumCommentBits; 938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Parameter passing direction, see ParamCommandComment::PassDirection. 958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned Direction : 2; 968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// True if direction was specified explicitly in the comment. 988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned IsDirectionExplicit : 1; 998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 100befceba36bb91f05dd36b06fae93e2539c944622Dmitri Gribenko enum { NumParamCommandCommentBits = 11 }; 1018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko union { 1038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBitfields CommentBits; 1048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBitfields InlineContentCommentBits; 1050f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBitfields TextCommentBits; 1063f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBitfields HTMLStartTagCommentBits; 1070f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBitfields ParagraphCommentBits; 1088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBitfields ParamCommandCommentBits; 1098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setSourceRange(SourceRange SR) { 1128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range = SR; 1138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setLocation(SourceLocation L) { 1168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc = L; 1178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko enum CommentKind { 1218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NoCommentKind = 0, 1228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) CLASS##Kind, 1238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT_RANGE(BASE, FIRST, LAST) \ 1248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind, 1258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LAST_COMMENT_RANGE(BASE, FIRST, LAST) \ 1268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind 1278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) 1288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 1298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(CommentKind K, 1328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 1338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 1348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc(LocBegin), Range(SourceRange(LocBegin, LocEnd)) { 1358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBits.Kind = K; 1368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentKind getCommentKind() const { 1398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<CommentKind>(CommentBits.Kind); 1408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const char *getCommentKindName() const; 1438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump() const; 1458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump(SourceManager &SM) const; 146fb3643a7509dcde7fb0fb7290e4b3b42b317700cDmitri Gribenko void dump(llvm::raw_ostream &OS, SourceManager *SM) const; 1478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *) { return true; } 1498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getSourceRange() const LLVM_READONLY { return Range; } 1518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocStart() const LLVM_READONLY { 1538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getBegin(); 1548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocEnd() const LLVM_READONLY { 1578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getEnd(); 1588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocation() const LLVM_READONLY { return Loc; } 1618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 162a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko typedef Comment * const *child_iterator; 163a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 1648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const; 1658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const; 1668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 167a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko // TODO: const child iterator 168a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 1698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned child_count() const { 1708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return child_end() - child_begin(); 1718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 1738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Inline content (contained within a block). 1758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 1768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineContentComment : public Comment { 1778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 1788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(CommentKind K, 1798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 1808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 1818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) { 1828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 0; 1838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstInlineContentCommentConstant && 1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastInlineContentCommentConstant; 1898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const InlineContentComment *) { return true; } 1928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void addTrailingNewline() { 1948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 1; 1958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasTrailingNewline() const { 1988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return InlineContentCommentBits.HasTrailingNewline; 1998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Plain text. 2038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass TextComment : public InlineContentComment { 2048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextComment(SourceLocation LocBegin, 2088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 2098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 2108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(TextCommentKind, LocBegin, LocEnd), 2110f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko Text(Text) { 2120f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = false; 2130f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == TextCommentKind; 2178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const TextComment *) { return true; } 2208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 2228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 2248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { return Text; } 226a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 2270f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 2280f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (TextCommentBits.IsWhitespaceValid) 2290f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2300f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2310f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespace = isWhitespaceNoCache(); 2320f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = true; 2330f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2340f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2350f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2360f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 2370f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 2388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command with word-like arguments that is considered inline content. 2418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineCommandComment : public InlineContentComment { 2428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 24336cbfbfce889642057bd007eac3569ea9f58e1e8Dmitri Gribenko struct Argument { 2448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 2458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 2488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 2498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 2518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command name. 2528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 2538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command arguments. 2558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args; 2568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineCommandComment(SourceLocation LocBegin, 2598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 2608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name, 2618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args) : 2628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(InlineCommandCommentKind, LocBegin, LocEnd), 2638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Name(Name), Args(Args) 2648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 2658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == InlineCommandCommentKind; 2688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const InlineCommandComment *) { return true; } 2718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 2738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 2758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCommandName() const { 2778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Name; 2788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getCommandNameRange() const { 2818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(getLocStart().getLocWithOffset(-1), 2828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocEnd()); 2838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2850eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 2868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 2878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 2908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 2918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 2948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 2958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class for opening and closing HTML tags. HTML tags are always 2998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// treated as inline content (regardless HTML semantics); opening and closing 3008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// tags are not matched. 3018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass HTMLTagComment : public InlineContentComment { 3028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 3038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName; 3048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange TagNameRange; 3058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko HTMLTagComment(CommentKind K, 3078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 3088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 3098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName, 3108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameBegin, 3118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameEnd) : 3128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(K, LocBegin, LocEnd), 3138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName(TagName), 3148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagNameRange(TagNameBegin, TagNameEnd) { 3158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(TagNameBegin); 3168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 3208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstHTMLTagCommentConstant && 3218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastHTMLTagCommentConstant; 3228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const HTMLTagComment *) { return true; } 3258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getTagName() const LLVM_READONLY { return TagName; } 3278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTagNameSourceRange() const LLVM_READONLY { 3298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = getLocation(); 3308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(L.getLocWithOffset(1), 3318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko L.getLocWithOffset(1 + TagName.size())); 3328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 3348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// An opening HTML tag with attributes. 3363f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLStartTagComment : public HTMLTagComment { 3378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class Attribute { 3398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public: 3408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NameLocBegin; 3418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 3428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc; 3448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange; 3468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Value; 3478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute() { } 3498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name) : 3518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 3528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(SourceLocation()), 3538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(SourceRange()), Value(StringRef()) 3548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 3558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name, 3578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc, 3588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange, StringRef Value) : 3598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 3608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(EqualsLoc), 3618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(ValueRange), Value(Value) 3628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 3638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getNameLocEnd() const { 3658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return NameLocBegin.getLocWithOffset(Name.size()); 3668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getNameRange() const { 3698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(NameLocBegin, getNameLocEnd()); 3708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 3728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprivate: 3748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ArrayRef<Attribute> Attributes; 3758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3773f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagComment(SourceLocation LocBegin, 3783f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 3793f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLStartTagCommentKind, 3808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocBegin.getLocWithOffset(1 + TagName.size()), 3818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 3828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(1), 383a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko LocBegin.getLocWithOffset(1 + TagName.size())) { 3843f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = false; 385a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 3868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 3883f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLStartTagCommentKind; 3898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3913f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko static bool classof(const HTMLStartTagComment *) { return true; } 3928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 3948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 3968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3970eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumAttrs() const { 3988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes.size(); 3998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &getAttr(unsigned Idx) const { 4028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes[Idx]; 4038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setAttrs(ArrayRef<Attribute> Attrs) { 4068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attributes = Attrs; 4078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (!Attrs.empty()) { 4088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &Attr = Attrs.back(); 4098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = Attr.ValueRange.getEnd(); 4108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (L.isValid()) 4118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(L); 4128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko else { 4138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(Attr.getNameLocEnd()); 4148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setGreaterLoc(SourceLocation GreaterLoc) { 4198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(GreaterLoc); 4208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 421a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 422a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isSelfClosing() const { 4233f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return HTMLStartTagCommentBits.IsSelfClosing; 424a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 425a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 426a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setSelfClosing() { 4273f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = true; 428a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 4298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A closing HTML tag. 4323f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLEndTagComment : public HTMLTagComment { 4338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4343f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLEndTagComment(SourceLocation LocBegin, 4353f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko SourceLocation LocEnd, 4363f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 4373f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLEndTagCommentKind, 4388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 4398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 4408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2), 4418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2 + TagName.size())) 4428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4453f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLEndTagCommentKind; 4468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4483f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko static bool classof(const HTMLEndTagComment *) { return true; } 4498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 4518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 4538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Block content (contains inline content). 4568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 4578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockContentComment : public Comment { 4588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 4598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(CommentKind K, 4608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 4618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 4628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) 4638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstBlockContentCommentConstant && 4688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastBlockContentCommentConstant; 4698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const BlockContentComment *) { return true; } 4728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A single paragraph that contains inline content. 4758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParagraphComment : public BlockContentComment { 4768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<InlineContentComment *> Content; 4778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment(llvm::ArrayRef<InlineContentComment *> Content) : 4808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(ParagraphCommentKind, 4818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation(), 4828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation()), 4838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content(Content) { 4840f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (Content.empty()) { 4850f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = true; 4860f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 4878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 4880f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 4890f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 4900f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = false; 4918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Content.front()->getLocStart(), 4938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content.back()->getLocEnd())); 4948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Content.front()->getLocStart()); 4958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParagraphCommentKind; 4998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const ParagraphComment *) { return true; } 5028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 5048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.begin()); 5058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 5088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.end()); 5098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 510a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 5110f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 5120f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (ParagraphCommentBits.IsWhitespaceValid) 5130f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5140f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5150f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = isWhitespaceNoCache(); 5160f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 5170f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5180f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 5190f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5200f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 5210f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 5228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 5238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command that has zero or more word-like arguments (number of word-like 5258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// arguments depends on command name) and a paragraph as an argument 5268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (e. g., \\brief). 5278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockCommandComment : public BlockContentComment { 5288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko struct Argument { 5308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 5318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 5328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument() { } 5348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 5358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 5368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 5388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command name. 5398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 5408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Word-like arguments. 5428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<Argument> Args; 5438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Paragraph argument. 5458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment *Paragraph; 5468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(CommentKind K, 5488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 5498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 5508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 5518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(K, LocBegin, LocEnd), 5528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Name(Name), 5538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph(NULL) { 5548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(getCommandNameRange().getBegin()); 5558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(SourceLocation LocBegin, 5598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 5608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 5618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd), 5628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Name(Name), 5638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph(NULL) { 5648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(getCommandNameRange().getBegin()); 5658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 568beef1cb6ebfaea4542fb6d6686caae27787a75e0Dmitri Gribenko return C->getCommentKind() >= FirstBlockCommandCommentConstant && 569beef1cb6ebfaea4542fb6d6686caae27787a75e0Dmitri Gribenko C->getCommentKind() <= LastBlockCommandCommentConstant; 5708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const BlockCommandComment *) { return true; } 5738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 5758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph); 5768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 5798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph + 1); 5808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCommandName() const { 5838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Name; 5848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getCommandNameRange() const { 5878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(getLocStart().getLocWithOffset(1), 5888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocStart().getLocWithOffset(1 + Name.size())); 5898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5910eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 5928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 5938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 5968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 5978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 6008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 6018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setArgs(llvm::ArrayRef<Argument> A) { 6048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Args = A; 605a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (Args.size() > 0) { 606a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko SourceLocation NewLocEnd = Args.back().Range.getEnd(); 607a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (NewLocEnd.isValid()) 608a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 609a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 6108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment *getParagraph() const LLVM_READONLY { 6138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Paragraph; 6148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setParagraph(ParagraphComment *PC) { 6178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph = PC; 6188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NewLocEnd = PC->getLocEnd(); 6198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (NewLocEnd.isValid()) 6208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 6218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 6238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Doxygen \\param command. 6258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParamCommandComment : public BlockCommandComment { 626a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoprivate: 627a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// Parameter index in the function declaration. 628a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned ParamIndex; 6298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 631a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko enum { InvalidParamIndex = ~0U }; 632a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 6338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandComment(SourceLocation LocBegin, 6348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 6358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 636a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko BlockCommandComment(ParamCommandCommentKind, LocBegin, LocEnd, Name), 637a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex(InvalidParamIndex) { 6388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = In; 6398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = false; 6408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 6438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParamCommandCommentKind; 6448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const ParamCommandComment *) { return true; } 6478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 648a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko enum PassDirection { 649a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko In, 650a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko Out, 651a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko InOut 652a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 653a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 654a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko static const char *getDirectionAsString(PassDirection D); 655a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 6568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko PassDirection getDirection() const LLVM_READONLY { 6578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<PassDirection>(ParamCommandCommentBits.Direction); 6588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool isDirectionExplicit() const LLVM_READONLY { 6618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return ParamCommandCommentBits.IsDirectionExplicit; 6628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setDirection(PassDirection Direction, bool Explicit) { 6658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = Direction; 6668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = Explicit; 6678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasParamName() const { 6700eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko return getNumArgs() > 0; 6718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getParamName() const { 6748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[0].Text; 6758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getParamNameRange() const { 6788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[0].Range; 6798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 680a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 681a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isParamIndexValid() const LLVM_READONLY { 682a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex != InvalidParamIndex; 683a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 684a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 685a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned getParamIndex() const LLVM_READONLY { 686a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex; 687a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 688a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 689a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setParamIndex(unsigned Index) { 690a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex = Index; 691a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko assert(isParamIndexValid()); 692a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 6938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 6948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A line of text contained in a verbatim block. 6968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimBlockLineComment : public Comment { 6978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 6988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 7008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockLineComment(SourceLocation LocBegin, 7018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 7028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(VerbatimBlockLineCommentKind, 7038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, 7048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(Text.size())), 7058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Text(Text) 7068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 7078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 7098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimBlockLineCommentKind; 7108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const VerbatimBlockLineComment *) { return true; } 7138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 7158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 7178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { 7198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 7208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 7228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 723d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim block command (e. g., preformatted code). Verbatim block has an 724d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// opening and a closing command and contains multiple lines of text 7258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (VerbatimBlockLineComment nodes). 7268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimBlockComment : public BlockCommandComment { 7278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 7288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef CloseName; 7298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation CloseNameLocBegin; 7308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<VerbatimBlockLineComment *> Lines; 7318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 7338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockComment(SourceLocation LocBegin, 7348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 7358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name) : 7368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimBlockCommentKind, 7378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, Name) 7388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 7398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 7418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimBlockCommentKind; 7428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const VerbatimBlockComment *) { return true; } 7458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 7478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.begin()); 7488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 7518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.end()); 7528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setCloseName(StringRef Name, SourceLocation LocBegin) { 7558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseName = Name; 7568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseNameLocBegin = LocBegin; 7578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setLines(llvm::ArrayRef<VerbatimBlockLineComment *> L) { 7608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Lines = L; 7618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCloseName() const { 7648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return CloseName; 7658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7670eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumLines() const { 7688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines.size(); 7698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText(unsigned LineIdx) const { 7728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines[LineIdx]->getText(); 7738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 7758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 776d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim line command. Verbatim line has an opening command, a single 777d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// line of text (up to the newline after the opening command) and has no 778d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// closing command. 7798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimLineComment : public BlockCommandComment { 7808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 7818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 7828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin; 7838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 7858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimLineComment(SourceLocation LocBegin, 7868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 7878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name, 7888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin, 7898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 7908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimLineCommentKind, 7918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 7928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Name), 7938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Text(Text), 7948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextBegin(TextBegin) 7958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 7968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 7988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimLineCommentKind; 7998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const VerbatimLineComment *) { return true; } 8028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 8048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 8068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const { 8088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 8098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTextRange() const { 8128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(TextBegin, getLocEnd()); 8138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 8158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A full comment attached to a declaration, contains block content. 8178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass FullComment : public Comment { 8188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko llvm::ArrayRef<BlockContentComment *> Blocks; 8198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 8218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko FullComment(llvm::ArrayRef<BlockContentComment *> Blocks) : 8228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(FullCommentKind, SourceLocation(), SourceLocation()), 8238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Blocks(Blocks) { 8248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Blocks.empty()) 8258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 8268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Blocks.front()->getLocStart(), 8288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Blocks.back()->getLocEnd())); 8298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Blocks.front()->getLocStart()); 8308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == FullCommentKind; 8348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const FullComment *) { return true; } 8378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 8398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Blocks.begin()); 8408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 8438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Blocks.end()); 8448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 8468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments 8488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang 8498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif 8518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 852