[clang-format] Don't move comments if AlignTrailingComments: Leave

For comments that start after a new line, currently, the comments are
being indented. This happens because the OriginalWhitespaceRange
considers newlines on the range. Therefore, when AlignTrailingComments:
Kind: Leave, deduct the number of newlines before the token to calculate
the number of spaces for trailing comments.

Fixes #59203.

Differential Revision: https://reviews.llvm.org/D139029
This commit is contained in:
Maíra Canal 2022-12-01 15:55:58 -08:00 committed by Owen Pan
parent 2b234ce3f0
commit ad83bead3d
2 changed files with 57 additions and 1 deletions

View File

@ -957,7 +957,8 @@ void WhitespaceManager::alignTrailingComments() {
if (Style.AlignTrailingComments.Kind == FormatStyle::TCAS_Leave) {
auto OriginalSpaces =
Changes[i].OriginalWhitespaceRange.getEnd().getRawEncoding() -
Changes[i].OriginalWhitespaceRange.getBegin().getRawEncoding();
Changes[i].OriginalWhitespaceRange.getBegin().getRawEncoding() -
Changes[i].Tok->NewlinesBefore;
unsigned RestoredLineLength = Changes[i].StartOfTokenColumn +
Changes[i].TokenLength + OriginalSpaces;
// If leaving comments makes the line exceed the column limit, give up to

View File

@ -3062,6 +3062,61 @@ TEST_F(FormatTestComments, AlignTrailingCommentsLeave) {
"int d;// comment\n",
Style));
EXPECT_EQ("// do not touch\n"
"int a; // any comments\n"
"\n"
" // comment\n"
"// comment\n"
"\n"
"// comment",
format("// do not touch\n"
"int a; // any comments\n"
"\n"
" // comment\n"
"// comment\n"
"\n"
"// comment",
Style));
EXPECT_EQ("// do not touch\n"
"int a; // any comments\n"
"\n"
" // comment\n"
"// comment\n"
"\n"
"// comment",
format("// do not touch\n"
"int a; // any comments\n"
"\n"
"\n"
" // comment\n"
"// comment\n"
"\n"
"\n"
"// comment",
Style));
// Allow to keep 2 empty lines
Style.MaxEmptyLinesToKeep = 2;
EXPECT_EQ("// do not touch\n"
"int a; // any comments\n"
"\n"
"\n"
" // comment\n"
"// comment\n"
"\n"
"// comment",
format("// do not touch\n"
"int a; // any comments\n"
"\n"
"\n"
" // comment\n"
"// comment\n"
"\n"
"// comment",
Style));
Style.MaxEmptyLinesToKeep = 1;
// Just format comments normally when leaving exceeds the column limit
Style.ColumnLimit = 35;
EXPECT_EQ("int foo = 12345; // comment\n"