1aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko//===--- RawCommentList.h - Classes for processing raw comments -*- C++ -*-===// 2aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko// 3aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko// The LLVM Compiler Infrastructure 4aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko// 5aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko// This file is distributed under the University of Illinois Open Source 6aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko// License. See LICENSE.TXT for details. 7aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko// 8aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko//===----------------------------------------------------------------------===// 9aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1027c0bb04bfdbf82b1d7e6670b8e806451e8ce2c3Dmitri Gribenko#ifndef LLVM_CLANG_AST_RAW_COMMENT_LIST_H 1127c0bb04bfdbf82b1d7e6670b8e806451e8ce2c3Dmitri Gribenko#define LLVM_CLANG_AST_RAW_COMMENT_LIST_H 12aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 136fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko#include "clang/Basic/CommentOptions.h" 14aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#include "clang/Basic/SourceManager.h" 15aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#include "llvm/ADT/ArrayRef.h" 16aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 17aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkonamespace clang { 18aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenkoclass ASTContext; 20aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoclass ASTReader; 21f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenkoclass Decl; 221952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenkoclass Preprocessor; 23f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko 24f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenkonamespace comments { 25f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko class FullComment; 26f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko} // end namespace comments 27aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 28aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoclass RawComment { 29aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkopublic: 30aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko enum CommentKind { 31c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_Invalid, ///< Invalid comment 32c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_OrdinaryBCPL, ///< Any normal BCPL comments 33c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_OrdinaryC, ///< Any normal C comment 34c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_BCPLSlash, ///< \code /// stuff \endcode 35c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_BCPLExcl, ///< \code //! stuff \endcode 36c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_JavaDoc, ///< \code /** stuff */ \endcode 37c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_Qt, ///< \code /*! stuff */ \endcode, also used by HeaderDoc 38c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RCK_Merged ///< Two or more documentation comments merged together 39aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko }; 40aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 41c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara RawComment() : Kind(RCK_Invalid), IsAlmostTrailingComment(false) { } 42aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 43aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawComment(const SourceManager &SourceMgr, SourceRange SR, 446fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko bool Merged, bool ParseAllComments); 45aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 46aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko CommentKind getKind() const LLVM_READONLY { 47aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return (CommentKind) Kind; 48aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 49aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 50aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool isInvalid() const LLVM_READONLY { 51c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara return Kind == RCK_Invalid; 52aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 53aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 54aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool isMerged() const LLVM_READONLY { 55c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara return Kind == RCK_Merged; 56aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 57aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 58f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko /// Is this comment attached to any declaration? 59a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko bool isAttached() const LLVM_READONLY { 60c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko return IsAttached; 61a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 62a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 63c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko void setAttached() { 64c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko IsAttached = true; 65a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko } 66a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko 67aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// Returns true if it is a comment that should be put after a member: 68aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// \code ///< stuff \endcode 69aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// \code //!< stuff \endcode 70aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// \code /**< stuff */ \endcode 71aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// \code /*!< stuff */ \endcode 72aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool isTrailingComment() const LLVM_READONLY { 732d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko assert(isDocumentation()); 74aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return IsTrailingComment; 75aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 76aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 77aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// Returns true if it is a probable typo: 78aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// \code //< stuff \endcode 79aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// \code /*< stuff */ \endcode 80aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool isAlmostTrailingComment() const LLVM_READONLY { 81aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return IsAlmostTrailingComment; 82aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 83aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 842d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko /// Returns true if this comment is not a documentation comment. 85aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool isOrdinary() const LLVM_READONLY { 866fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko return ((Kind == RCK_OrdinaryBCPL) || (Kind == RCK_OrdinaryC)) && 876fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko !ParseAllComments; 88aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 89aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 902d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko /// Returns true if this comment any kind of a documentation comment. 912d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko bool isDocumentation() const LLVM_READONLY { 920e7f2bb1810a4e5e62a8e247460cd26f981d0827Dmitri Gribenko return !isInvalid() && !isOrdinary(); 936fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko } 946fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko 956fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko /// Returns whether we are parsing all comments. 966fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko bool isParseAllComments() const LLVM_READONLY { 976fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko return ParseAllComments; 98aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 99aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 100aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// Returns raw comment text with comment markers. 101aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko StringRef getRawText(const SourceManager &SourceMgr) const { 102aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko if (RawTextValid) 103aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return RawText; 104aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 105aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawText = getRawTextSlow(SourceMgr); 106aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawTextValid = true; 107aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return RawText; 108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 110aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceRange getSourceRange() const LLVM_READONLY { 111aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return Range; 112aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 113aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 114aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko unsigned getBeginLine(const SourceManager &SM) const; 115aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko unsigned getEndLine(const SourceManager &SM) const; 116aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 117d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const char *getBriefText(const ASTContext &Context) const { 1182d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko if (BriefTextValid) 1192d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko return BriefText; 1202d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko 1212d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko return extractBriefText(Context); 1222d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko } 1232d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko 124c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko /// Parse the comment, assuming it is attached to decl \c D. 1251952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko comments::FullComment *parse(const ASTContext &Context, 1261952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko const Preprocessor *PP, const Decl *D) const; 127f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko 128aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoprivate: 129aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceRange Range; 130aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 131aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko mutable StringRef RawText; 132d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko mutable const char *BriefText; 1332d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko 1342d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko mutable bool RawTextValid : 1; ///< True if RawText is valid 1352d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko mutable bool BriefTextValid : 1; ///< True if BriefText is valid 136aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 137aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko unsigned Kind : 3; 138aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 139c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko /// True if comment is attached to a declaration in ASTContext. 140c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko bool IsAttached : 1; 141c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko 142aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool IsTrailingComment : 1; 143aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool IsAlmostTrailingComment : 1; 144aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1456fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko /// When true, ordinary comments starting with "//" and "/*" will be 1466fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko /// considered as documentation comments. 1476fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko bool ParseAllComments : 1; 1486fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko 149aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko mutable bool BeginLineValid : 1; ///< True if BeginLine is valid 150aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko mutable bool EndLineValid : 1; ///< True if EndLine is valid 151aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko mutable unsigned BeginLine; ///< Cached line number 152aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko mutable unsigned EndLine; ///< Cached line number 153aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 154aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko /// \brief Constructor for AST deserialization. 155aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawComment(SourceRange SR, CommentKind K, bool IsTrailingComment, 1566fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko bool IsAlmostTrailingComment, 1576fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko bool ParseAllComments) : 158c2cda0284a3e80fa4b39b540f6c73782fa69fa6bDmitri Gribenko Range(SR), RawTextValid(false), BriefTextValid(false), Kind(K), 159c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko IsAttached(false), IsTrailingComment(IsTrailingComment), 160aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko IsAlmostTrailingComment(IsAlmostTrailingComment), 1616fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko ParseAllComments(ParseAllComments), 162aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko BeginLineValid(false), EndLineValid(false) 163aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko { } 164aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 165aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko StringRef getRawTextSlow(const SourceManager &SourceMgr) const; 166aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 167d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const char *extractBriefText(const ASTContext &Context) const; 1682d44d77fed3200e2eff289f55493317e90d3398cDmitri Gribenko 169aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko friend class ASTReader; 170aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}; 171aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 172aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko/// \brief Compare comments' source locations. 173aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkotemplate<> 174aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoclass BeforeThanCompare<RawComment> { 175aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko const SourceManager &SM; 176aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 177aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkopublic: 178aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko explicit BeforeThanCompare(const SourceManager &SM) : SM(SM) { } 179aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 1809530a8bf275f91f95147e1fb205dc85bea1ae45cDmitri Gribenko bool operator()(const RawComment &LHS, const RawComment &RHS) { 181aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return SM.isBeforeInTranslationUnit(LHS.getSourceRange().getBegin(), 1829530a8bf275f91f95147e1fb205dc85bea1ae45cDmitri Gribenko RHS.getSourceRange().getBegin()); 183aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 184811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko 185811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko bool operator()(const RawComment *LHS, const RawComment *RHS) { 186811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko return operator()(*LHS, *RHS); 187811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko } 188aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}; 189aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 190aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko/// \brief This class represents all comments included in the translation unit, 191aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko/// sorted in order of appearance in the translation unit. 192aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoclass RawCommentList { 193aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkopublic: 194aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawCommentList(SourceManager &SourceMgr) : 195aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceMgr(SourceMgr), OnlyWhitespaceSeen(true) { } 196aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 197811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko void addComment(const RawComment &RC, llvm::BumpPtrAllocator &Allocator); 198aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 199811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko ArrayRef<RawComment *> getComments() const { 200aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko return Comments; 201aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 202aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 203aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoprivate: 204aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko SourceManager &SourceMgr; 205811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko std::vector<RawComment *> Comments; 2064a66557c297e1e5a71a3da4ceca1969800e7de70Dmitri Gribenko SourceLocation PrevCommentEndLoc; 207aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko bool OnlyWhitespaceSeen; 208aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 209811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko void addCommentsToFront(const std::vector<RawComment *> &C) { 210aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko size_t OldSize = Comments.size(); 211aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Comments.resize(C.size() + OldSize); 212aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::copy_backward(Comments.begin(), Comments.begin() + OldSize, 213aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Comments.end()); 214aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko std::copy(C.begin(), C.end(), Comments.begin()); 215aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko } 216aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 217aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko friend class ASTReader; 218aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}; 219aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 220aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} // end namespace clang 221aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 222aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#endif 223