void RawCommentList::addComment(const RawComment &RC, llvm::BumpPtrAllocator &Allocator) { if (RC.isInvalid()) return; // Check if the comments are not in source order. while (!Comments.empty() && !SourceMgr.isBeforeInTranslationUnit( Comments.back()->getSourceRange().getBegin(), RC.getSourceRange().getBegin())) { // If they are, just pop a few last comments that don't fit. // This happens if an \#include directive contains comments. Comments.pop_back(); } if (OnlyWhitespaceSeen) { if (!onlyWhitespaceBetween(SourceMgr, PrevCommentEndLoc, RC.getSourceRange().getBegin())) OnlyWhitespaceSeen = false; } PrevCommentEndLoc = RC.getSourceRange().getEnd(); // Ordinary comments are not interesting for us. if (RC.isOrdinary()) return; // If this is the first Doxygen comment, save it (because there isn't // anything to merge it with). if (Comments.empty()) { Comments.push_back(new (Allocator) RawComment(RC)); OnlyWhitespaceSeen = true; return; } const RawComment &C1 = *Comments.back(); const RawComment &C2 = RC; // Merge comments only if there is only whitespace between them. // Can't merge trailing and non-trailing comments. // Merge comments if they are on same or consecutive lines. bool Merged = false; if (OnlyWhitespaceSeen && (C1.isTrailingComment() == C2.isTrailingComment())) { unsigned C1EndLine = C1.getEndLine(SourceMgr); unsigned C2BeginLine = C2.getBeginLine(SourceMgr); if (C1EndLine + 1 == C2BeginLine || C1EndLine == C2BeginLine) { SourceRange MergedRange(C1.getSourceRange().getBegin(), C2.getSourceRange().getEnd()); *Comments.back() = RawComment(SourceMgr, MergedRange, true, RC.isParseAllComments()); Merged = true; } } if (!Merged) Comments.push_back(new (Allocator) RawComment(RC)); OnlyWhitespaceSeen = true; }
void RawCommentList::addComment(const RawComment &RC, llvm::BumpPtrAllocator &Allocator) { if (RC.isInvalid()) return; // Check if the comments are not in source order. while (!Comments.empty() && !SourceMgr.isBeforeInTranslationUnit(Comments.back()->getLocStart(), RC.getLocStart())) { // If they are, just pop a few last comments that don't fit. // This happens if an \#include directive contains comments. Comments.pop_back(); } // Ordinary comments are not interesting for us. if (RC.isOrdinary()) return; // If this is the first Doxygen comment, save it (because there isn't // anything to merge it with). if (Comments.empty()) { Comments.push_back(new (Allocator) RawComment(RC)); return; } const RawComment &C1 = *Comments.back(); const RawComment &C2 = RC; // Merge comments only if there is only whitespace between them. // Can't merge trailing and non-trailing comments unless the second is // non-trailing ordinary in the same column, as in the case: // int x; // documents x // // more text // versus: // int x; // documents x // int y; // documents y // or: // int x; // documents x // // documents y // int y; // Merge comments if they are on same or consecutive lines. if ((C1.isTrailingComment() == C2.isTrailingComment() || (C1.isTrailingComment() && !C2.isTrailingComment() && isOrdinaryKind(C2.getKind()) && commentsStartOnSameColumn(SourceMgr, C1, C2))) && onlyWhitespaceBetween(SourceMgr, C1.getLocEnd(), C2.getLocStart(), /*MaxNewlinesAllowed=*/1)) { SourceRange MergedRange(C1.getLocStart(), C2.getLocEnd()); *Comments.back() = RawComment(SourceMgr, MergedRange, true, RC.isParseAllComments()); } else { Comments.push_back(new (Allocator) RawComment(RC)); } }