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