]> granicus.if.org Git - clang/commitdiff
clang-format: Fix bug in column-layout formatting.
authorDaniel Jasper <djasper@google.com>
Mon, 26 Aug 2013 08:10:17 +0000 (08:10 +0000)
committerDaniel Jasper <djasper@google.com>
Mon, 26 Aug 2013 08:10:17 +0000 (08:10 +0000)
Specific arrangements of comments after trailing commas could confuse
the column width calculation, e.g. in:

vector<int> 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
unittests/Format/FormatTest.cpp

index 1b6d360190510d9d88252bfafaa59573a00a049c..24a296adc2404a723ff3d09a66deb8611567fe2d 100644 (file)
@@ -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<unsigned, 8> 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;
   }
 
index 5606aa109b51947aa91d679e953b2c9ff98fcca9..fed054d0aea79631d3f10853a6ccf96b2795af9a 100644 (file)
@@ -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<int> x = { 1, 1, 1, 1,\n"
+               "                  1, 1, 1, 1,\n"
+               "                  /**/ /**/ };",
+               getLLVMStyleWithColumns(39));
 }
 
 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {