Author: owenpan Date: Fri May 3 16:15:40 2019 New Revision: 359943 URL: http://llvm.org/viewvc/llvm-project?rev=359943&view=rev Log: [clang-format] Fix bug in block comment reflow that joins * and /
Fixes PR41213 Differential Revision: https://reviews.llvm.org/D61276 Modified: cfe/trunk/lib/Format/BreakableToken.cpp cfe/trunk/lib/Format/BreakableToken.h cfe/trunk/unittests/Format/FormatTest.cpp Modified: cfe/trunk/lib/Format/BreakableToken.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/BreakableToken.cpp?rev=359943&r1=359942&r2=359943&view=diff ============================================================================== --- cfe/trunk/lib/Format/BreakableToken.cpp (original) +++ cfe/trunk/lib/Format/BreakableToken.cpp Fri May 3 16:15:40 2019 @@ -65,7 +65,8 @@ static StringRef getLineCommentIndentPre static BreakableToken::Split getCommentSplit(StringRef Text, unsigned ContentStartColumn, unsigned ColumnLimit, unsigned TabWidth, - encoding::Encoding Encoding, const FormatStyle &Style) { + encoding::Encoding Encoding, const FormatStyle &Style, + bool DecorationEndsWithStar = false) { LLVM_DEBUG(llvm::dbgs() << "Comment split: \"" << Text << "\", Column limit: " << ColumnLimit << ", Content start: " << ContentStartColumn << "\n"); @@ -123,7 +124,10 @@ getCommentSplit(StringRef Text, unsigned if (SpaceOffset == 1 && Text[SpaceOffset - 1] == '*') return BreakableToken::Split(StringRef::npos, 0); StringRef BeforeCut = Text.substr(0, SpaceOffset).rtrim(Blanks); - StringRef AfterCut = Text.substr(SpaceOffset).ltrim(Blanks); + StringRef AfterCut = Text.substr(SpaceOffset); + // Don't trim the leading blanks if it would create a */ after the break. + if (!DecorationEndsWithStar || AfterCut.size() <= 1 || AfterCut[1] != '/') + AfterCut = AfterCut.ltrim(Blanks); return BreakableToken::Split(BeforeCut.size(), AfterCut.begin() - BeforeCut.end()); } @@ -452,6 +456,18 @@ BreakableBlockComment::BreakableBlockCom }); } +BreakableToken::Split +BreakableBlockComment::getSplit(unsigned LineIndex, unsigned TailOffset, + unsigned ColumnLimit, unsigned ContentStartColumn, + llvm::Regex &CommentPragmasRegex) const { + // Don't break lines matching the comment pragmas regex. + if (CommentPragmasRegex.match(Content[LineIndex])) + return Split(StringRef::npos, 0); + return getCommentSplit(Content[LineIndex].substr(TailOffset), + ContentStartColumn, ColumnLimit, Style.TabWidth, + Encoding, Style, Decoration.endswith("*")); +} + void BreakableBlockComment::adjustWhitespace(unsigned LineIndex, int IndentDelta) { // When in a preprocessor directive, the trailing backslash in a block comment Modified: cfe/trunk/lib/Format/BreakableToken.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/BreakableToken.h?rev=359943&r1=359942&r2=359943&view=diff ============================================================================== --- cfe/trunk/lib/Format/BreakableToken.h (original) +++ cfe/trunk/lib/Format/BreakableToken.h Fri May 3 16:15:40 2019 @@ -361,6 +361,9 @@ public: bool InPPDirective, encoding::Encoding Encoding, const FormatStyle &Style, bool UseCRLF); + Split getSplit(unsigned LineIndex, unsigned TailOffset, unsigned ColumnLimit, + unsigned ContentStartColumn, + llvm::Regex &CommentPragmasRegex) const override; unsigned getRangeLength(unsigned LineIndex, unsigned Offset, StringRef::size_type Length, unsigned StartColumn) const override; Modified: cfe/trunk/unittests/Format/FormatTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=359943&r1=359942&r2=359943&view=diff ============================================================================== --- cfe/trunk/unittests/Format/FormatTest.cpp (original) +++ cfe/trunk/unittests/Format/FormatTest.cpp Fri May 3 16:15:40 2019 @@ -11150,6 +11150,24 @@ TEST_F(FormatTest, OptimizeBreakPenaltyV FormatStyle Style = getLLVMStyle(); Style.ColumnLimit = 20; + // See PR41213 + EXPECT_EQ("/*\n" + " *\t9012345\n" + " * /8901\n" + " */", + format("/*\n" + " *\t9012345 /8901\n" + " */", + Style)); + EXPECT_EQ("/*\n" + " *345678\n" + " *\t/8901\n" + " */", + format("/*\n" + " *345678\t/8901\n" + " */", + Style)); + verifyFormat("int a; // the\n" " // comment", Style); EXPECT_EQ("int a; /* first line\n" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits