From 332c67703f63fafd26cf88fc31faeb80c1523725 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Mon, 26 Aug 2013 08:10:17 +0000 Subject: [PATCH] clang-format: Fix bug in column-layout formatting. Specific arrangements of comments after trailing commas could confuse the column width calculation, e.g. in: vector x = { a, b, /* some */ /* comment */ }; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189211 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/FormatToken.cpp | 16 ++++++++-------- unittests/Format/FormatTest.cpp | 6 +++++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/Format/FormatToken.cpp b/lib/Format/FormatToken.cpp index 1b6d360190..24a296adc2 100644 --- a/lib/Format/FormatToken.cpp +++ b/lib/Format/FormatToken.cpp @@ -77,11 +77,13 @@ unsigned CommaSeparatedList::format(LineState &State, // assuming that the entire sequence is put on a single line. static unsigned CodePointsBetween(const FormatToken *Begin, const FormatToken *End) { + assert(End->TotalLength >= Begin->TotalLength); return End->TotalLength - Begin->TotalLength + Begin->CodePointCount; } void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) { - if (!Token->MatchingParen) + // FIXME: At some point we might want to do this for other lists, too. + if (!Token->MatchingParen || Token->isNot(tok::l_brace)) return; FormatToken *ItemBegin = Token->Next; @@ -92,11 +94,6 @@ void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) { SmallVector EndOfLineItemLength; for (unsigned i = 0, e = Commas.size() + 1; i != e; ++i) { - // If there is a trailing comma in the list, the next item will start at the - // closing brace. Don't create an extra item for this. - if (ItemBegin == Token->MatchingParen) - break; - // Skip comments on their own line. while (ItemBegin->HasUnescapedNewline && ItemBegin->isTrailingComment()) ItemBegin = ItemBegin->Next; @@ -119,14 +116,17 @@ void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) { } else { ItemEnd = Commas[i]; // The comma is counted as part of the item when calculating the length. - ItemLengths.push_back(ItemEnd->TotalLength - ItemBegin->TotalLength + - ItemBegin->CodePointCount); + ItemLengths.push_back(CodePointsBetween(ItemBegin, ItemEnd)); // Consume trailing comments so the are included in EndOfLineItemLength. if (ItemEnd->Next && !ItemEnd->Next->HasUnescapedNewline && ItemEnd->Next->isTrailingComment()) ItemEnd = ItemEnd->Next; } EndOfLineItemLength.push_back(CodePointsBetween(ItemBegin, ItemEnd)); + // If there is a trailing comma in the list, the next item will start at the + // closing brace. Don't create an extra item for this. + if (ItemEnd->getNextNonComment() == Token->MatchingParen) + break; ItemBegin = ItemEnd->Next; } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 5606aa109b..fed054d0ae 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -3530,7 +3530,7 @@ TEST_F(FormatTest, IndentsRelativeToUnaryOperators) { " bbbbbb);"); } -TEST_F(FormatTest, UndestandsOverloadedOperators) { +TEST_F(FormatTest, UnderstandsOverloadedOperators) { verifyFormat("bool operator<();"); verifyFormat("bool operator>();"); verifyFormat("bool operator=();"); @@ -4191,6 +4191,10 @@ TEST_F(FormatTest, FormatsBracedListsinColumnLayout) { " 1, 1, 1, 1, 1, 1, 1, 1, //\n" "};", getLLVMStyleWithColumns(39)); + verifyFormat("vector x = { 1, 1, 1, 1,\n" + " 1, 1, 1, 1,\n" + " /**/ /**/ };", + getLLVMStyleWithColumns(39)); } TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) { -- 2.50.1