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