clang-format: Fix bug in multiline comment wrapping.

Splitting:
  /**
   * multiline block comment
   *
   */

Before:
  /**
   * multiline block
   *comment
   *
   */

After:
  /**
   * multiline block
   * comment
   *
   */

The reason was that the empty line inside the comment (with just the "*") was
confusing the comment breaking logic.

llvm-svn: 236573
This commit is contained in:
Daniel Jasper 2015-05-06 07:17:22 +00:00
parent 26f165b04e
commit 6d9b88dd99
2 changed files with 23 additions and 6 deletions

View File

@ -277,6 +277,8 @@ BreakableBlockComment::BreakableBlockComment(
// If the last line is empty, the closing "*/" will have a star.
if (i + 1 == e && Lines[i].empty())
break;
if (!Lines[i].empty() && i + 1 != e && Decoration.startswith(Lines[i]))
continue;
while (!Lines[i].startswith(Decoration))
Decoration = Decoration.substr(0, Decoration.size() - 1);
}
@ -297,14 +299,18 @@ BreakableBlockComment::BreakableBlockComment(
}
continue;
}
// The first line already excludes the star.
// For all other lines, adjust the line to exclude the star and
// (optionally) the first whitespace.
StartOfLineColumn[i] += Decoration.size();
Lines[i] = Lines[i].substr(Decoration.size());
LeadingWhitespace[i] += Decoration.size();
IndentAtLineBreak =
std::min<int>(IndentAtLineBreak, std::max(0, StartOfLineColumn[i]));
unsigned DecorationSize =
Decoration.startswith(Lines[i]) ? Lines[i].size() : Decoration.size();
StartOfLineColumn[i] += DecorationSize;
Lines[i] = Lines[i].substr(DecorationSize);
LeadingWhitespace[i] += DecorationSize;
if (!Decoration.startswith(Lines[i]))
IndentAtLineBreak =
std::min<int>(IndentAtLineBreak, std::max(0, StartOfLineColumn[i]));
}
IndentAtLineBreak = std::max<unsigned>(IndentAtLineBreak, Decoration.size());
DEBUG({

View File

@ -1621,6 +1621,17 @@ TEST_F(FormatTest, SplitsLongLinesInComments) {
" */",
getLLVMStyleWithColumns(20)));
EXPECT_EQ("/**\n"
" * multiline block\n"
" * comment\n"
" *\n"
" */",
format("/**\n"
" * multiline block comment\n"
" *\n"
" */",
getLLVMStyleWithColumns(20)));
EXPECT_EQ("/*\n"
"\n"
"\n"
@ -6525,7 +6536,7 @@ TEST_F(FormatTest, BlockComments) {
EXPECT_EQ("/*\n"
"*\n"
" * aaaaaa\n"
"*aaaaaa\n"
" * aaaaaa\n"
"*/",
format("/*\n"
"*\n"