Skip to content

Commit

Permalink
[clang-format] Fix bug in block comment reflow that joins * and /
Browse files Browse the repository at this point in the history
Fixes PR41213

Differential Revision: https://reviews.llvm.org/D61276

llvm-svn: 359943
  • Loading branch information
owenca authored and MrSidims committed May 17, 2019
1 parent c6347d7 commit c9e2543
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 2 deletions.
20 changes: 18 additions & 2 deletions clang/lib/Format/BreakableToken.cpp
Expand Up @@ -65,7 +65,8 @@ static StringRef getLineCommentIndentPrefix(StringRef Comment,
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");
Expand Down Expand Up @@ -123,7 +124,10 @@ getCommentSplit(StringRef Text, unsigned ContentStartColumn,
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());
}
Expand Down Expand Up @@ -452,6 +456,18 @@ BreakableBlockComment::BreakableBlockComment(
});
}

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
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Format/BreakableToken.h
Expand Up @@ -361,6 +361,9 @@ class BreakableBlockComment : public BreakableComment {
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;
Expand Down
18 changes: 18 additions & 0 deletions clang/unittests/Format/FormatTest.cpp
Expand Up @@ -11150,6 +11150,24 @@ TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
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"
Expand Down

0 comments on commit c9e2543

Please sign in to comment.