[clang-format] Break non-trailing block comments

Summary:
This patch is an alternative to https://reviews.llvm.org/D36614, by resolving a
non-idempotency issue by breaking non-trailing comments:

Consider formatting the following code with column limit at `V`:
```
                    V
const /* comment comment */ A = B;
```
The comment is not a trailing comment, breaking before it doesn't bring it under
the column limit. The formatter breaks after it, resulting in:

```
                    V
const /* comment comment */
    A = B;
```
For a next reformat, the formatter considers the comment as a trailing comment,
so it is free to break it further, resulting in:

```
                    V
const /* comment
         comment */
    A = B;
```
This patch improves the situation by directly producing the third case.

Reviewers: djasper

Reviewed By: djasper

Subscribers: cfe-commits, klimek

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

llvm-svn: 311457
This commit is contained in:
Krasimir Georgiev 2017-08-22 14:40:05 +00:00
parent 5fb51ddf29
commit fe268fc1c8
2 changed files with 17 additions and 1 deletions

View File

@ -1282,7 +1282,7 @@ unsigned ContinuationIndenter::breakProtrudingToken(const FormatToken &Current,
return 0;
}
} else if (Current.is(TT_BlockComment)) {
if (!Current.isTrailingComment() || !Style.ReflowComments ||
if (!Style.ReflowComments ||
// If a comment token switches formatting, like
// /* clang-format on */, we don't want to break it further,
// but we may still want to adjust its indentation.

View File

@ -2780,6 +2780,22 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
"* long */",
getLLVMStyleWithColumns(20)));
}
TEST_F(FormatTestComments, NonTrailingBlockComments) {
verifyFormat("const /** comment comment */ A = B;",
getLLVMStyleWithColumns(40));
verifyFormat("const /** comment comment comment */ A =\n"
" B;",
getLLVMStyleWithColumns(40));
EXPECT_EQ("const /** comment comment comment\n"
" comment */\n"
" A = B;",
format("const /** comment comment comment comment */\n"
" A = B;",
getLLVMStyleWithColumns(40)));
}
} // end namespace
} // end namespace format
} // end namespace clang