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