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 17e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "clang/AST/CommentCommandTraits.h" 18bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian#include "clang/AST/DeclObjC.h" 1930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/AST/Type.h" 2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/SourceLocation.h" 218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/ArrayRef.h" 228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "llvm/ADT/StringRef.h" 238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace clang { 251ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkoclass Decl; 261ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkoclass ParmVarDecl; 271ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkoclass TemplateParameterList; 281ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkonamespace comments { 30749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanianclass FullComment; 31808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko 32808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko/// Describes the syntax that was used in a documentation command. 33808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko/// 34808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko/// Exact values of this enumeration are important because they used to select 35808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko/// parts of diagnostic messages. Audit diagnostics before changing or adding 36808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko/// a new value. 37808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenkoenum CommandMarkerKind { 38808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// Command started with a backslash character: 39808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// \code 40808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// \foo 41808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// \endcode 42808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CMK_Backslash = 0, 43808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko 44808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// Command started with an 'at' character: 45808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// \code 46808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// @foo 47808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// \endcode 48808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CMK_At = 1 49808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko}; 50808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko 518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Any part of the comment. 528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass Comment { 548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Preferred location to show caret. 568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation Loc; 578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Source range of this AST node. 598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class CommentBitfields { 628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class Comment; 638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Type of this AST node. 658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned Kind : 8; 668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko enum { NumCommentBits = 8 }; 688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class InlineContentCommentBitfields { 708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class InlineContentComment; 718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned : NumCommentBits; 738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// True if there is a newline after this inline content node. 758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// (There is no separate AST node for a newline.) 768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned HasTrailingNewline : 1; 778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 780f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumInlineContentCommentBits = NumCommentBits + 1 }; 790f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 800f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko class TextCommentBitfields { 810f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko friend class TextComment; 820f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 830f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko unsigned : NumInlineContentCommentBits; 840f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 850f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if \c IsWhitespace field contains a valid value. 860f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespaceValid : 1; 870f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 880f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if this comment AST node contains only whitespace. 890f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespace : 1; 900f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko }; 910f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumTextCommentBits = NumInlineContentCommentBits + 2 }; 928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 932d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko class InlineCommandCommentBitfields { 942d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko friend class InlineCommandComment; 952d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 962d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko unsigned : NumInlineContentCommentBits; 972d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 982d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko unsigned RenderKind : 2; 99e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID : 8; 1002d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko }; 101e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko enum { NumInlineCommandCommentBits = NumInlineContentCommentBits + 10 }; 1022d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 1033f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko class HTMLStartTagCommentBitfields { 1043f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko friend class HTMLStartTagComment; 105a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 106befceba36bb91f05dd36b06fae93e2539c944622Dmitri Gribenko unsigned : NumInlineContentCommentBits; 107a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 108a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// True if this tag is self-closing (e. g., <br />). This is based on tag 109a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// spelling in comment (plain <br> would not set this flag). 110a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned IsSelfClosing : 1; 111a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 1128986e108e04a4fbe9248f87708410bb073940d7bDmitri Gribenko enum { NumHTMLStartTagCommentBits = NumInlineContentCommentBits + 1 }; 113a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 1140f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko class ParagraphCommentBitfields { 1150f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko friend class ParagraphComment; 1160f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 1170f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko unsigned : NumCommentBits; 1180f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 1190f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if \c IsWhitespace field contains a valid value. 1200f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespaceValid : 1; 1210f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 1220f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko /// True if this comment AST node contains only whitespace. 1230f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko mutable unsigned IsWhitespace : 1; 1240f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko }; 1250f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko enum { NumParagraphCommentBits = NumCommentBits + 2 }; 1260f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 127e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko class BlockCommandCommentBitfields { 128e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko friend class BlockCommandComment; 129e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 130e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned : NumCommentBits; 131e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 132e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID : 8; 133808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko 134808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// Describes the syntax that was used in a documentation command. 135808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko /// Contains values from CommandMarkerKind enum. 136808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko unsigned CommandMarker : 1; 137e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko }; 138808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko enum { NumBlockCommandCommentBits = NumCommentBits + 9 }; 139e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 1408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class ParamCommandCommentBitfields { 1418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko friend class ParamCommandComment; 1428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 143e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned : NumBlockCommandCommentBits; 1448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Parameter passing direction, see ParamCommandComment::PassDirection. 1468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned Direction : 2; 1478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// True if direction was specified explicitly in the comment. 1498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned IsDirectionExplicit : 1; 1508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 151e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko enum { NumParamCommandCommentBits = NumBlockCommandCommentBits + 3 }; 1528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko union { 1548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBitfields CommentBits; 1558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBitfields InlineContentCommentBits; 1560f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBitfields TextCommentBits; 1572d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineCommandCommentBitfields InlineCommandCommentBits; 1583f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBitfields HTMLStartTagCommentBits; 1590f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBitfields ParagraphCommentBits; 160e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandCommentBitfields BlockCommandCommentBits; 1618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBitfields ParamCommandCommentBits; 1628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setSourceRange(SourceRange SR) { 1658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range = SR; 1668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setLocation(SourceLocation L) { 1698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc = L; 1708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko enum CommentKind { 1748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NoCommentKind = 0, 1758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT(CLASS, PARENT) CLASS##Kind, 1768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define COMMENT_RANGE(BASE, FIRST, LAST) \ 1778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind, 1788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define LAST_COMMENT_RANGE(BASE, FIRST, LAST) \ 1798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind 1808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#define ABSTRACT_COMMENT(COMMENT) 1818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#include "clang/AST/CommentNodes.inc" 1828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 1838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(CommentKind K, 1858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 1868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 1878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Loc(LocBegin), Range(SourceRange(LocBegin, LocEnd)) { 1888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentBits.Kind = K; 1898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CommentKind getCommentKind() const { 1928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<CommentKind>(CommentBits.Kind); 1938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 1948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const char *getCommentKindName() const; 1968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump() const; 1987ba443aa8cfb222737d3a964a19ad4fb1328c4b5Richard Trieu LLVM_ATTRIBUTE_USED void dumpColor() const; 199e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko LLVM_ATTRIBUTE_USED void dump(const ASTContext &Context) const; 200cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko void dump(raw_ostream &OS, const CommandTraits *Traits, 201e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const SourceManager *SM) const; 2028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getSourceRange() const LLVM_READONLY { return Range; } 2048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocStart() const LLVM_READONLY { 2068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getBegin(); 2078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocEnd() const LLVM_READONLY { 2108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Range.getEnd(); 2118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getLocation() const LLVM_READONLY { return Loc; } 2148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 215a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko typedef Comment * const *child_iterator; 216a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 2178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const; 2188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const; 2198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 220a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko // TODO: const child iterator 221a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 2228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko unsigned child_count() const { 2238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return child_end() - child_begin(); 2248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Inline content (contained within a block). 2288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 2298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineContentComment : public Comment { 2308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 2318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(CommentKind K, 2328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 2338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 2348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) { 2358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 0; 2368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstInlineContentCommentConstant && 2418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastInlineContentCommentConstant; 2428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void addTrailingNewline() { 2458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentCommentBits.HasTrailingNewline = 1; 2468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasTrailingNewline() const { 2498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return InlineContentCommentBits.HasTrailingNewline; 2508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Plain text. 2548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass TextComment : public InlineContentComment { 2558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 2588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextComment(SourceLocation LocBegin, 2598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 2608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 2618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(TextCommentKind, LocBegin, LocEnd), 2620f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko Text(Text) { 2630f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = false; 2640f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 2678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == TextCommentKind; 2688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 2698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 2718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 2738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { return Text; } 275a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 2760f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 2770f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (TextCommentBits.IsWhitespaceValid) 2780f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2790f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2800f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespace = isWhitespaceNoCache(); 2810f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko TextCommentBits.IsWhitespaceValid = true; 2820f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return TextCommentBits.IsWhitespace; 2830f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 2840f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 2850f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 2860f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 2878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 2888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command with word-like arguments that is considered inline content. 2908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass InlineCommandComment : public InlineContentComment { 2918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 29236cbfbfce889642057bd007eac3569ea9f58e1e8Dmitri Gribenko struct Argument { 2938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 2948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 2958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 2978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 2988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 2992d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko /// The most appropriate rendering mode for this command, chosen on command 3002d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko /// semantics in Doxygen. 3012d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko enum RenderKind { 3022d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderNormal, 3032d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderBold, 3042d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderMonospaced, 3052d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderEmphasized 3062d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko }; 3072d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 3088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 3098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Command arguments. 310cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<Argument> Args; 3118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineCommandComment(SourceLocation LocBegin, 3148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 315e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID, 3162d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderKind RK, 317cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<Argument> Args) : 3182d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineContentComment(InlineCommandCommentKind, LocBegin, LocEnd), 319e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko Args(Args) { 3202d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko InlineCommandCommentBits.RenderKind = RK; 321e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko InlineCommandCommentBits.CommandID = CommandID; 3222d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko } 3238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 3258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == InlineCommandCommentKind; 3268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 3298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 3318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 332e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned getCommandID() const { 333e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return InlineCommandCommentBits.CommandID; 334e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 335e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 336e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef getCommandName(const CommandTraits &Traits) const { 337e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Traits.getCommandInfo(getCommandID())->Name; 3388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getCommandNameRange() const { 3418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(getLocStart().getLocWithOffset(-1), 3428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocEnd()); 3438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3452d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko RenderKind getRenderKind() const { 3462d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko return static_cast<RenderKind>(InlineCommandCommentBits.RenderKind); 3472d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko } 3482d66a5016d4aacce362f89290261c8a1a6eef0d3Dmitri Gribenko 3490eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 3508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 3518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 3548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 3558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 3588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 3598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 3618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class for opening and closing HTML tags. HTML tags are always 3638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// treated as inline content (regardless HTML semantics); opening and closing 3648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// tags are not matched. 3658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass HTMLTagComment : public InlineContentComment { 3668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 3678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName; 3688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange TagNameRange; 3698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko HTMLTagComment(CommentKind K, 3718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 3728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 3738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef TagName, 3748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameBegin, 3758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TagNameEnd) : 3768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko InlineContentComment(K, LocBegin, LocEnd), 3778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName(TagName), 3788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagNameRange(TagNameBegin, TagNameEnd) { 3798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(TagNameBegin); 3808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 3838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 3848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstHTMLTagCommentConstant && 3858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastHTMLTagCommentConstant; 3868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getTagName() const LLVM_READONLY { return TagName; } 3898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTagNameSourceRange() const LLVM_READONLY { 3918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = getLocation(); 3928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(L.getLocWithOffset(1), 3938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko L.getLocWithOffset(1 + TagName.size())); 3948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 3958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 3968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 3978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// An opening HTML tag with attributes. 3983f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLStartTagComment : public HTMLTagComment { 3998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko class Attribute { 4018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko public: 4028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NameLocBegin; 4038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Name; 4048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc; 4068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange; 4088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Value; 4098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute() { } 4118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name) : 4138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 4148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(SourceLocation()), 4158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(SourceRange()), Value(StringRef()) 4168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attribute(SourceLocation NameLocBegin, StringRef Name, 4198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation EqualsLoc, 4208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange ValueRange, StringRef Value) : 4218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko NameLocBegin(NameLocBegin), Name(Name), 4228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko EqualsLoc(EqualsLoc), 4238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ValueRange(ValueRange), Value(Value) 4248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 4258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation getNameLocEnd() const { 4278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return NameLocBegin.getLocWithOffset(Name.size()); 4288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getNameRange() const { 4318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(NameLocBegin, getNameLocEnd()); 4328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 4348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprivate: 4368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ArrayRef<Attribute> Attributes; 4378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4393f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagComment(SourceLocation LocBegin, 4403f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 4413f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLStartTagCommentKind, 4428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocBegin.getLocWithOffset(1 + TagName.size()), 4438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 4448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(1), 445a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko LocBegin.getLocWithOffset(1 + TagName.size())) { 4463f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = false; 447a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 4488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 4503f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLStartTagCommentKind; 4518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 4548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 4568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4570eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumAttrs() const { 4588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes.size(); 4598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &getAttr(unsigned Idx) const { 4628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Attributes[Idx]; 4638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setAttrs(ArrayRef<Attribute> Attrs) { 4668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Attributes = Attrs; 4678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (!Attrs.empty()) { 4688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko const Attribute &Attr = Attrs.back(); 4698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation L = Attr.ValueRange.getEnd(); 4708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (L.isValid()) 4718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(L); 4728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko else { 4738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(Attr.getNameLocEnd()); 4748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 4778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setGreaterLoc(SourceLocation GreaterLoc) { 4798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Range.setEnd(GreaterLoc); 4808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 481a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 482a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isSelfClosing() const { 4833f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return HTMLStartTagCommentBits.IsSelfClosing; 484a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 485a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 486a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setSelfClosing() { 4873f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLStartTagCommentBits.IsSelfClosing = true; 488a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 4898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 4908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 4918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A closing HTML tag. 4923f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenkoclass HTMLEndTagComment : public HTMLTagComment { 4938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 4943f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLEndTagComment(SourceLocation LocBegin, 4953f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko SourceLocation LocEnd, 4963f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko StringRef TagName) : 4973f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko HTMLTagComment(HTMLEndTagCommentKind, 4988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 4998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TagName, 5008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2), 5018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(2 + TagName.size())) 5028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 5038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 5053f38bf2d441fac379c427f86153fbb0cb41256c6Dmitri Gribenko return C->getCommentKind() == HTMLEndTagCommentKind; 5068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 5098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 5118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 5128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Block content (contains inline content). 5148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Abstract class. 5158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockContentComment : public Comment { 5168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 5178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(CommentKind K, 5188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 5198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd) : 5208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(K, LocBegin, LocEnd) 5218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 5228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 5258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() >= FirstBlockContentCommentConstant && 5268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko C->getCommentKind() <= LastBlockContentCommentConstant; 5278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 5298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A single paragraph that contains inline content. 5318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParagraphComment : public BlockContentComment { 532cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<InlineContentComment *> Content; 5338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 535cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ParagraphComment(ArrayRef<InlineContentComment *> Content) : 5368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(ParagraphCommentKind, 5378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation(), 5388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation()), 5398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content(Content) { 5400f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (Content.empty()) { 5410f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = true; 5420f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 5438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 5440f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 5450f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5460f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = false; 5478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Content.front()->getLocStart(), 5498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Content.back()->getLocEnd())); 5508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Content.front()->getLocStart()); 5518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 5548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParagraphCommentKind; 5558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 5588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.begin()); 5598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 5608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 5628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Content.end()); 5638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 564a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 5650f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespace() const { 5660f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko if (ParagraphCommentBits.IsWhitespaceValid) 5670f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5680f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5690f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespace = isWhitespaceNoCache(); 5700f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko ParagraphCommentBits.IsWhitespaceValid = true; 5710f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko return ParagraphCommentBits.IsWhitespace; 5720f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko } 5730f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko 5740f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenkoprivate: 5750f7f10bd0ea08abf56c69fea9316275a1ee0e40cDmitri Gribenko bool isWhitespaceNoCache() const; 5768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 5778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A command that has zero or more word-like arguments (number of word-like 5798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// arguments depends on command name) and a paragraph as an argument 5808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (e. g., \\brief). 5818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass BlockCommandComment : public BlockContentComment { 5828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 5838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko struct Argument { 5848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange Range; 5858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 5868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument() { } 5888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { } 5898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko }; 5908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 5928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Word-like arguments. 593cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<Argument> Args; 5948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 5958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko /// Paragraph argument. 5968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment *Paragraph; 597808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko 5988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(CommentKind K, 5998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocBegin, 6008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 6018536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian unsigned CommandID, 602808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandMarkerKind CommandMarker) : 6038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(K, LocBegin, LocEnd), 604808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko Paragraph(NULL) { 605e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko setLocation(getCommandNameBeginLoc()); 606e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandCommentBits.CommandID = CommandID; 607808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko BlockCommandCommentBits.CommandMarker = CommandMarker; 6088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 6118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(SourceLocation LocBegin, 6128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 6138536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian unsigned CommandID, 614808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandMarkerKind CommandMarker) : 6158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd), 616808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko Paragraph(NULL) { 617e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko setLocation(getCommandNameBeginLoc()); 618e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandCommentBits.CommandID = CommandID; 619808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko BlockCommandCommentBits.CommandMarker = CommandMarker; 6208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 623beef1cb6ebfaea4542fb6d6686caae27787a75e0Dmitri Gribenko return C->getCommentKind() >= FirstBlockCommandCommentConstant && 624beef1cb6ebfaea4542fb6d6686caae27787a75e0Dmitri Gribenko C->getCommentKind() <= LastBlockCommandCommentConstant; 6258d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6268d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6278d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 6288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph); 6298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 6328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(&Paragraph + 1); 6338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 635e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned getCommandID() const { 636e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return BlockCommandCommentBits.CommandID; 6378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 639e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef getCommandName(const CommandTraits &Traits) const { 640e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Traits.getCommandInfo(getCommandID())->Name; 641e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 642e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 643e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko SourceLocation getCommandNameBeginLoc() const { 644e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return getLocStart().getLocWithOffset(1); 645e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 646e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 647e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko SourceRange getCommandNameRange(const CommandTraits &Traits) const { 648e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef Name = getCommandName(Traits); 649e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return SourceRange(getCommandNameBeginLoc(), 6508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko getLocStart().getLocWithOffset(1 + Name.size())); 6518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6530eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumArgs() const { 6548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args.size(); 6558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getArgText(unsigned Idx) const { 6588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Text; 6598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getArgRange(unsigned Idx) const { 6628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[Idx].Range; 6638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 665cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko void setArgs(ArrayRef<Argument> A) { 6668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Args = A; 667a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (Args.size() > 0) { 668a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko SourceLocation NewLocEnd = Args.back().Range.getEnd(); 669a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko if (NewLocEnd.isValid()) 670a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 671a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 6728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6738d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6748d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParagraphComment *getParagraph() const LLVM_READONLY { 6758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Paragraph; 6768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 6778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 678ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko bool hasNonWhitespaceParagraph() const { 679ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko return Paragraph && !Paragraph->isWhitespace(); 680ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko } 681ae99b75fbbac1deaccdcc1b326b8fb6b07a1e72dDmitri Gribenko 6828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setParagraph(ParagraphComment *PC) { 6838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Paragraph = PC; 6848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation NewLocEnd = PC->getLocEnd(); 6858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (NewLocEnd.isValid()) 6868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(getLocStart(), NewLocEnd)); 6878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 688808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko 689808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandMarkerKind getCommandMarker() const LLVM_READONLY { 690808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko return static_cast<CommandMarkerKind>( 691808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko BlockCommandCommentBits.CommandMarker); 692c98e9130bcddd0258c110d30749edd2284087e3dFariborz Jahanian } 6938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 6948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 6958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// Doxygen \\param command. 6968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass ParamCommandComment : public BlockCommandComment { 697a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenkoprivate: 698a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko /// Parameter index in the function declaration. 699a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned ParamIndex; 7008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 702c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko enum { 703c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko InvalidParamIndex = ~0U, 704de2541aec4b4440ee34af29eba622df7cab9ac12Aaron Ballman VarArgParamIndex = ~0U/*InvalidParamIndex*/ - 1U 705c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko }; 706a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 7078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandComment(SourceLocation LocBegin, 7088d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 7098536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian unsigned CommandID, 710808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandMarkerKind CommandMarker) : 711e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko BlockCommandComment(ParamCommandCommentKind, LocBegin, LocEnd, 712808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandID, CommandMarker), 713a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex(InvalidParamIndex) { 7148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = In; 7158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = false; 7168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 7198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == ParamCommandCommentKind; 7208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 722a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko enum PassDirection { 723a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko In, 724a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko Out, 725a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko InOut 726a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko }; 727a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 728a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko static const char *getDirectionAsString(PassDirection D); 729a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 7308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko PassDirection getDirection() const LLVM_READONLY { 7318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return static_cast<PassDirection>(ParamCommandCommentBits.Direction); 7328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool isDirectionExplicit() const LLVM_READONLY { 7358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return ParamCommandCommentBits.IsDirectionExplicit; 7368d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setDirection(PassDirection Direction, bool Explicit) { 7398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.Direction = Direction; 7408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko ParamCommandCommentBits.IsDirectionExplicit = Explicit; 7418d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7428d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko bool hasParamName() const { 7440eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko return getNumArgs() > 0; 7458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 7468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7478cfabf2cb278efc1f694f1d9aab76888a60ee3acDmitri Gribenko StringRef getParamName(const FullComment *FC) const; 7488cfabf2cb278efc1f694f1d9aab76888a60ee3acDmitri Gribenko 749262e60c1ccb5197e8e2ea49ada1196ed65183734Fariborz Jahanian StringRef getParamNameAsWritten() const { 750262e60c1ccb5197e8e2ea49ada1196ed65183734Fariborz Jahanian return Args[0].Text; 751262e60c1ccb5197e8e2ea49ada1196ed65183734Fariborz Jahanian } 7528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 7538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getParamNameRange() const { 7548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Args[0].Range; 7558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 756a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 757a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isParamIndexValid() const LLVM_READONLY { 758a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex != InvalidParamIndex; 759a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 760a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 761c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko bool isVarArgParam() const LLVM_READONLY { 762c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko return ParamIndex == VarArgParamIndex; 763c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko } 764c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko 765c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko void setIsVarArgParam() { 766c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko ParamIndex = VarArgParamIndex; 767c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko assert(isParamIndexValid()); 768c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko } 769c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko 770a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko unsigned getParamIndex() const LLVM_READONLY { 771b740316a122b5ceaaa7cf50557b1b39af5fbbf5fDmitri Gribenko assert(isParamIndexValid()); 772c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko assert(!isVarArgParam()); 773a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko return ParamIndex; 774a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 775a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 776a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko void setParamIndex(unsigned Index) { 777a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko ParamIndex = Index; 778a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko assert(isParamIndexValid()); 779c5b0054693b3b3cafe6a13549358c22e07fcd4ffDmitri Gribenko assert(!isVarArgParam()); 780a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 7818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 7828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 78396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko/// Doxygen \\tparam command, describes a template parameter. 78496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkoclass TParamCommandComment : public BlockCommandComment { 78596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkoprivate: 78696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// If this template parameter name was resolved (found in template parameter 78796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// list), then this stores a list of position indexes in all template 78896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// parameter lists. 78996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// 79096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For example: 79196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// \verbatim 79296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// template<typename C, template<typename T> class TT> 79396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// void test(TT<int> aaa); 79496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// \endverbatim 79596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For C: Position = { 0 } 79696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For TT: Position = { 1 } 79796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko /// For T: Position = { 1, 0 } 798cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<unsigned> Position; 79996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 80096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenkopublic: 80196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko TParamCommandComment(SourceLocation LocBegin, 80296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko SourceLocation LocEnd, 8038536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian unsigned CommandID, 804808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandMarkerKind CommandMarker) : 8058536fa14ee1048e5e2d62cb3dc11fc640c7dc00dFariborz Jahanian BlockCommandComment(TParamCommandCommentKind, LocBegin, LocEnd, CommandID, 806808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandMarker) 80796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko { } 80896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 80996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko static bool classof(const Comment *C) { 81096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return C->getCommentKind() == TParamCommandCommentKind; 81196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 81296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 81396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko bool hasParamName() const { 81496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return getNumArgs() > 0; 81596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 81696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 8178cfabf2cb278efc1f694f1d9aab76888a60ee3acDmitri Gribenko StringRef getParamName(const FullComment *FC) const; 8188cfabf2cb278efc1f694f1d9aab76888a60ee3acDmitri Gribenko 819262e60c1ccb5197e8e2ea49ada1196ed65183734Fariborz Jahanian StringRef getParamNameAsWritten() const { 820262e60c1ccb5197e8e2ea49ada1196ed65183734Fariborz Jahanian return Args[0].Text; 821262e60c1ccb5197e8e2ea49ada1196ed65183734Fariborz Jahanian } 82296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 82396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko SourceRange getParamNameRange() const { 82496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return Args[0].Range; 82596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 82696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 82796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko bool isPositionValid() const LLVM_READONLY { 82896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return !Position.empty(); 82996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 83096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 83196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko unsigned getDepth() const { 83296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko assert(isPositionValid()); 83396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return Position.size(); 83496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 83596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 83696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko unsigned getIndex(unsigned Depth) const { 83796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko assert(isPositionValid()); 83896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko return Position[Depth]; 83996b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 84096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 84196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko void setPosition(ArrayRef<unsigned> NewPosition) { 84296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko Position = NewPosition; 84396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko assert(isPositionValid()); 84496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko } 84596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko}; 84696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko 8478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A line of text contained in a verbatim block. 8488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimBlockLineComment : public Comment { 8498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 8508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 8528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockLineComment(SourceLocation LocBegin, 8538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 8548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(VerbatimBlockLineCommentKind, 8558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, 8568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin.getLocWithOffset(Text.size())), 8578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Text(Text) 8588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 8598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimBlockLineCommentKind; 8628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8648d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 8658d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8668d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 8678d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8688d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const LLVM_READONLY { 8698d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 8708d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8718d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 8728d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 873d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim block command (e. g., preformatted code). Verbatim block has an 874d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// opening and a closing command and contains multiple lines of text 8758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// (VerbatimBlockLineComment nodes). 8768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimBlockComment : public BlockCommandComment { 8778d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 8788d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef CloseName; 8798d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation CloseNameLocBegin; 880cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<VerbatimBlockLineComment *> Lines; 8818d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 8838d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimBlockComment(SourceLocation LocBegin, 8848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 885e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) : 8868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimBlockCommentKind, 887808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko LocBegin, LocEnd, CommandID, 888808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CMK_At) // FIXME: improve source fidelity. 8898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 8908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 8928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimBlockCommentKind; 8938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 8968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.begin()); 8978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 8988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 8998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 9008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Lines.end()); 9018d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9038d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko void setCloseName(StringRef Name, SourceLocation LocBegin) { 9048d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseName = Name; 9058d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko CloseNameLocBegin = LocBegin; 9068d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9078d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 908cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko void setLines(ArrayRef<VerbatimBlockLineComment *> L) { 9098d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Lines = L; 9108d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9118d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9128d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getCloseName() const { 9138d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return CloseName; 9148d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9158d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9160eaf69d9a10149f0f344238183915912c2dca392Dmitri Gribenko unsigned getNumLines() const { 9178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines.size(); 9188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText(unsigned LineIdx) const { 9218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Lines[LineIdx]->getText(); 9228d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9238d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 9248d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 925d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// A verbatim line command. Verbatim line has an opening command, a single 926d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// line of text (up to the newline after the opening command) and has no 927d64e2ee48a6dca4612dda56b785be571be391047Dmitri Gribenko/// closing command. 9288d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass VerbatimLineComment : public BlockCommandComment { 9298d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoprotected: 9308d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text; 9318d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin; 9328d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9338d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 9348d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko VerbatimLineComment(SourceLocation LocBegin, 9358d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation LocEnd, 936e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID, 9378d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceLocation TextBegin, 9388d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef Text) : 9398d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko BlockCommandComment(VerbatimLineCommentKind, 9408d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko LocBegin, LocEnd, 941808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CommandID, 942808383d2d6d58a7c7db85f8c7618fb74d821309fDmitri Gribenko CMK_At), // FIXME: improve source fidelity. 9438d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Text(Text), 9448d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko TextBegin(TextBegin) 9458d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko { } 9468d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9478d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 9488d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == VerbatimLineCommentKind; 9498d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9508d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9518d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { return NULL; } 9528d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9538d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { return NULL; } 9548d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9558d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko StringRef getText() const { 9568d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return Text; 9578d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9588d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9598d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko SourceRange getTextRange() const { 9608d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return SourceRange(TextBegin, getLocEnd()); 9618d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 9628d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 9638d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 9641ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko/// Information about the declaration, useful to clients of FullComment. 9651ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenkostruct DeclInfo { 9664a7c6eb2bbc9f7c00604d8d93ec66fd98cf4e404Fariborz Jahanian /// Declaration the comment is actually attached to (in the source). 9674a7c6eb2bbc9f7c00604d8d93ec66fd98cf4e404Fariborz Jahanian /// Should not be NULL. 968bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian const Decl *CommentDecl; 969bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 9704a7c6eb2bbc9f7c00604d8d93ec66fd98cf4e404Fariborz Jahanian /// CurrentDecl is the declaration with which the FullComment is associated. 971168425c9bdd8ed17df0ac76a19d6033f4808bd46Dmitri Gribenko /// 972168425c9bdd8ed17df0ac76a19d6033f4808bd46Dmitri Gribenko /// It can be different from \c CommentDecl. It happens when we we decide 973168425c9bdd8ed17df0ac76a19d6033f4808bd46Dmitri Gribenko /// that the comment originally attached to \c CommentDecl is fine for 974168425c9bdd8ed17df0ac76a19d6033f4808bd46Dmitri Gribenko /// \c CurrentDecl too (for example, for a redeclaration or an overrider of 975168425c9bdd8ed17df0ac76a19d6033f4808bd46Dmitri Gribenko /// \c CommentDecl). 976168425c9bdd8ed17df0ac76a19d6033f4808bd46Dmitri Gribenko /// 9774a7c6eb2bbc9f7c00604d8d93ec66fd98cf4e404Fariborz Jahanian /// The information in the DeclInfo corresponds to CurrentDecl. 9781bfb00dabf83d8c8b95b7276b4c0ae3fd64832c8Fariborz Jahanian const Decl *CurrentDecl; 97988d285cc0fc4ecdbc88d1779dcd2da968aa8b191Fariborz Jahanian 980bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Parameters that can be referenced by \\param if \c CommentDecl is something 9811ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// that we consider a "function". 9821ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko ArrayRef<const ParmVarDecl *> ParamVars; 9831ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 984bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Function result type if \c CommentDecl is something that we consider 98589ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko /// a "function". 98689ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko QualType ResultType; 98789ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko 988bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Template parameters that can be referenced by \\tparam if \c CommentDecl is 98904bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko /// a template (\c IsTemplateDecl or \c IsTemplatePartialSpecialization is 99004bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko /// true). 9911ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko const TemplateParameterList *TemplateParameters; 9921ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 993bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// A simplified description of \c CommentDecl kind that should be good enough 994af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// for documentation rendering purposes. 995af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko enum DeclKind { 99689ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko /// Everything else not explicitly mentioned below. 99789ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko OtherKind, 99889ab7d0012ffe02a335b765eeb9b48977a5ecd79Dmitri Gribenko 999af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// Something that we consider a "function": 1000af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li function, 1001af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li function template, 1002af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li function template specialization, 1003af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li member function, 1004af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li member function template, 1005af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li member function template specialization, 100670ff1091315c60fed68d7197c637ec8c588e67a1Dmitri Gribenko /// \li ObjC method, 100770ff1091315c60fed68d7197c637ec8c588e67a1Dmitri Gribenko /// \li a typedef for a function pointer, member function pointer, 100870ff1091315c60fed68d7197c637ec8c588e67a1Dmitri Gribenko /// ObjC block. 1009af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko FunctionKind, 1010af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 1011af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// Something that we consider a "class": 1012af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li class/struct, 1013af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li class template, 1014af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li class template (partial) specialization. 1015af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko ClassKind, 1016af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 1017af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// Something that we consider a "variable": 1018af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// \li namespace scope variables; 1019dd7b803e6ce5b8e61cf3b14af2c57199e5e991d9Dmitri Gribenko /// \li static and non-static class data members; 102016bec0630ef488af263d521b166b41ffa3c71743Dmitri Gribenko /// \li enumerators. 1021af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko VariableKind, 1022af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 1023af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// A C++ namespace. 1024af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko NamespaceKind, 1025af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 1026af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// A C++ typedef-name (a 'typedef' decl specifier or alias-declaration), 1027af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko /// see \c TypedefNameDecl. 1028cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko TypedefKind, 1029cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko 1030cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko /// An enumeration or scoped enumeration. 1031cff339a60a571a606a7510548f661dc6a719368dDmitri Gribenko EnumKind 1032af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko }; 1033af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 1034bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// What kind of template specialization \c CommentDecl is. 103504bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko enum TemplateDeclKind { 103604bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko NotTemplate, 103704bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko Template, 103804bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko TemplateSpecialization, 103904bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko TemplatePartialSpecialization 104004bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko }; 104104bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko 1042bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// If false, only \c CommentDecl is valid. 10431ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko unsigned IsFilled : 1; 10441ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 10457ae5717de7a6a20df60b7b058eb04c2452e39906Dmitri Gribenko /// Simplified kind of \c CommentDecl, see \c DeclKind enum. 1046af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko unsigned Kind : 3; 10471ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 1048bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Is \c CommentDecl a template declaration. 104904bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko unsigned TemplateKind : 2; 10501ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 1051bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Is \c CommentDecl an ObjCMethodDecl. 105288815f3f81361692dd281000e3e46bf163b2f28bDmitri Gribenko unsigned IsObjCMethod : 1; 105388815f3f81361692dd281000e3e46bf163b2f28bDmitri Gribenko 10547ae5717de7a6a20df60b7b058eb04c2452e39906Dmitri Gribenko /// Is \c CommentDecl a non-static member function of C++ class or 10551ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// instance method of ObjC class. 10561ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// Can be true only if \c IsFunctionDecl is true. 10571ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko unsigned IsInstanceMethod : 1; 10581ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 1059bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian /// Is \c CommentDecl a static member function of C++ class or 10601ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// class method of ObjC class. 10611ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko /// Can be true only if \c IsFunctionDecl is true. 10621ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko unsigned IsClassMethod : 1; 10631ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 10641ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko void fill(); 1065af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko 1066af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko DeclKind getKind() const LLVM_READONLY { 1067af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko return static_cast<DeclKind>(Kind); 1068af19a6aaa2959ef5e76f19d51e87ef523bdeeddeDmitri Gribenko } 106904bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko 107004bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko TemplateDeclKind getTemplateKind() const LLVM_READONLY { 107104bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko return static_cast<TemplateDeclKind>(TemplateKind); 107204bf29eb1b197e0a103139ab5d63b0b97432f004Dmitri Gribenko } 10731ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko}; 10741ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 10758d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko/// A full comment attached to a declaration, contains block content. 10768d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkoclass FullComment : public Comment { 1077cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<BlockContentComment *> Blocks; 10781ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko DeclInfo *ThisDeclInfo; 10791ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 10808d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenkopublic: 1081cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko FullComment(ArrayRef<BlockContentComment *> Blocks, DeclInfo *D) : 10828d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Comment(FullCommentKind, SourceLocation(), SourceLocation()), 1083749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian Blocks(Blocks), ThisDeclInfo(D) { 10848d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko if (Blocks.empty()) 10858d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return; 10868d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10878d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setSourceRange(SourceRange(Blocks.front()->getLocStart(), 10888d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko Blocks.back()->getLocEnd())); 10898d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko setLocation(Blocks.front()->getLocStart()); 10908d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 10918d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10928d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko static bool classof(const Comment *C) { 10938d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return C->getCommentKind() == FullCommentKind; 10948d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 10958d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 10968d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_begin() const { 10978d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko return reinterpret_cast<child_iterator>(Blocks.begin()); 10988d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 10998d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 11008d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko child_iterator child_end() const { 1101749ace614b6ea1ae11d194a60b18e1e43e1db243Fariborz Jahanian return reinterpret_cast<child_iterator>(Blocks.end()); 11028d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko } 11031ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko 11041ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko const Decl *getDecl() const LLVM_READONLY { 1105bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian return ThisDeclInfo->CommentDecl; 11061ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko } 1107bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 11081ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko const DeclInfo *getDeclInfo() const LLVM_READONLY { 11091ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko if (!ThisDeclInfo->IsFilled) 11101ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko ThisDeclInfo->fill(); 11111ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko return ThisDeclInfo; 11121ca7ecc8854ffea215c033a0d8482551bf1b73f0Dmitri Gribenko } 1113bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 1114cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<BlockContentComment *> getBlocks() const { return Blocks; } 1115bf967be66ea8c51b66c61659c23240f762a56dbeFariborz Jahanian 11168d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko}; 11178d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace comments 11188d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko} // end namespace clang 11198d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 11208d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko#endif 11218d3ba23f2d9e6c87794d059412a0808c9cbacb25Dmitri Gribenko 1122