Skip to content

Commit aa596fa

Browse files
authored
[clang-format] Set Change.TokenLength to ColumnWidth (llvm#90378)
Fixes llvm#37705. Fixes llvm#47333. Fixes llvm#47624. Fixes llvm#58850. Fixes llvm#75929. Fixes llvm#87885. Fixes llvm#89916.
1 parent 9c1de62 commit aa596fa

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

clang/lib/Format/WhitespaceManager.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ void WhitespaceManager::calculateLineBreakInformation() {
131131
for (unsigned I = 1, e = Changes.size(); I != e; ++I) {
132132
auto &C = Changes[I];
133133
auto &P = Changes[I - 1];
134+
auto &PrevTokLength = P.TokenLength;
134135
SourceLocation OriginalWhitespaceStart =
135136
C.OriginalWhitespaceRange.getBegin();
136137
SourceLocation PreviousOriginalWhitespaceEnd =
@@ -169,21 +170,23 @@ void WhitespaceManager::calculateLineBreakInformation() {
169170
// line of the token.
170171
auto NewlinePos = Text.find_first_of('\n');
171172
if (NewlinePos == StringRef::npos) {
172-
P.TokenLength = OriginalWhitespaceStartOffset -
173+
PrevTokLength = OriginalWhitespaceStartOffset -
173174
PreviousOriginalWhitespaceEndOffset +
174175
C.PreviousLinePostfix.size() + P.CurrentLinePrefix.size();
176+
if (!P.IsInsideToken)
177+
PrevTokLength = std::min(PrevTokLength, P.Tok->ColumnWidth);
175178
} else {
176-
P.TokenLength = NewlinePos + P.CurrentLinePrefix.size();
179+
PrevTokLength = NewlinePos + P.CurrentLinePrefix.size();
177180
}
178181

179182
// If there are multiple changes in this token, sum up all the changes until
180183
// the end of the line.
181184
if (P.IsInsideToken && P.NewlinesBefore == 0)
182-
LastOutsideTokenChange->TokenLength += P.TokenLength + P.Spaces;
185+
LastOutsideTokenChange->TokenLength += PrevTokLength + P.Spaces;
183186
else
184187
LastOutsideTokenChange = &P;
185188

186-
C.PreviousEndOfTokenColumn = P.StartOfTokenColumn + P.TokenLength;
189+
C.PreviousEndOfTokenColumn = P.StartOfTokenColumn + PrevTokLength;
187190

188191
P.IsTrailingComment =
189192
(C.NewlinesBefore > 0 || C.Tok->is(tok::eof) ||

clang/unittests/Format/FormatTest.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27363,6 +27363,45 @@ TEST_F(FormatTest, BreakAdjacentStringLiterals) {
2736327363
verifyFormat(Code, Style);
2736427364
}
2736527365

27366+
TEST_F(FormatTest, AlignUTFCommentsAndStringLiterals) {
27367+
verifyFormat(
27368+
"int rus; // А теперь комментарии, например, на русском, 2-байта\n"
27369+
"int long_rus; // Верхний коммент еще не превысил границу в 80, однако\n"
27370+
" // уже отодвинут. Перенос, при этом, отрабатывает верно");
27371+
27372+
auto Style = getLLVMStyle();
27373+
Style.ColumnLimit = 15;
27374+
verifyNoChange("#define test \\\n"
27375+
" /* 测试 */ \\\n"
27376+
" \"aa\" \\\n"
27377+
" \"bb\"",
27378+
Style);
27379+
27380+
Style.ColumnLimit = 25;
27381+
verifyFormat("struct foo {\n"
27382+
" int iiiiii; ///< iiiiii\n"
27383+
" int b; ///< ыыы\n"
27384+
" int c; ///< ыыыы\n"
27385+
"};",
27386+
Style);
27387+
27388+
Style.ColumnLimit = 35;
27389+
verifyFormat("#define SENSOR_DESC_1 \\\n"
27390+
" \"{\" \\\n"
27391+
" \"unit_of_measurement: \\\"°C\\\",\" \\\n"
27392+
" \"}\"",
27393+
Style);
27394+
27395+
Style.ColumnLimit = 80;
27396+
Style.AlignArrayOfStructures = FormatStyle::AIAS_Left;
27397+
verifyFormat("Languages languages = {\n"
27398+
" Language{{'e', 'n'}, U\"Test English\" },\n"
27399+
" Language{{'l', 'v'}, U\"Test Latviešu\"},\n"
27400+
" Language{{'r', 'u'}, U\"Test Русский\" },\n"
27401+
"};",
27402+
Style);
27403+
}
27404+
2736627405
} // namespace
2736727406
} // namespace test
2736827407
} // namespace format

0 commit comments

Comments
 (0)