]> granicus.if.org Git - clang/commitdiff
clang-format: Fix formatting of nested blocks after comment.
authorDaniel Jasper <djasper@google.com>
Sun, 20 Oct 2013 17:28:32 +0000 (17:28 +0000)
committerDaniel Jasper <djasper@google.com>
Sun, 20 Oct 2013 17:28:32 +0000 (17:28 +0000)
Before:
  DEBUG({ // Comment that used to confuse clang-format.
  fdafas();
  });
Before:
  DEBUG({ // Comments are now fine.
    fdafas();
  });

This fixed llvm.org/PR17619.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193051 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Format/Format.cpp
unittests/Format/FormatTest.cpp

index 90c3e9e96d5bbdb3cc79757db4c4190f82836fc6..79244b199378c59ed4315900e099aae2b318b787 100644 (file)
@@ -541,9 +541,10 @@ private:
   /// break or don't break.
   bool formatChildren(LineState &State, bool NewLine, bool DryRun,
                       unsigned &Penalty) {
-    const FormatToken &LBrace = *State.NextToken->Previous;
-    if (LBrace.isNot(tok::l_brace) || LBrace.BlockKind != BK_Block ||
-        LBrace.Children.size() == 0)
+    const FormatToken &Previous = *State.NextToken->Previous;
+    const FormatToken *LBrace = State.NextToken->getPreviousNonComment();
+    if (!LBrace || LBrace->isNot(tok::l_brace) ||
+        LBrace->BlockKind != BK_Block || Previous.Children.size() == 0)
       // The previous token does not open a block. Nothing to do. We don't
       // assert so that we can simply call this function for all tokens.
       return true;
@@ -551,8 +552,8 @@ private:
     if (NewLine) {
       unsigned ParentIndent = State.Stack.back().Indent;
       for (SmallVector<AnnotatedLine *, 1>::const_iterator
-               I = LBrace.Children.begin(),
-               E = LBrace.Children.end();
+               I = Previous.Children.begin(),
+               E = Previous.Children.end();
            I != E; ++I) {
         unsigned Indent =
             ParentIndent + ((*I)->Level - Line.Level - 1) * Style.IndentWidth;
@@ -570,24 +571,24 @@ private:
       return true;
     }
 
-    if (LBrace.Children.size() > 1)
+    if (Previous.Children.size() > 1)
       return false; // Cannot merge multiple statements into a single line.
 
     // We can't put the closing "}" on a line with a trailing comment.
-    if (LBrace.Children[0]->Last->isTrailingComment())
+    if (Previous.Children[0]->Last->isTrailingComment())
       return false;
 
     if (!DryRun) {
       Whitespaces->replaceWhitespace(
-          *LBrace.Children[0]->First,
+          *Previous.Children[0]->First,
           /*Newlines=*/0, /*IndentLevel=*/0, /*Spaces=*/1,
           /*StartOfTokenColumn=*/State.Column, State.Line->InPPDirective);
       UnwrappedLineFormatter Formatter(Indenter, Whitespaces, Style,
-                                       *LBrace.Children[0]);
+                                       *Previous.Children[0]);
       Penalty += Formatter.format(State.Column + 1, DryRun);
     }
 
-    State.Column += 1 + LBrace.Children[0]->Last->TotalLength;
+    State.Column += 1 + Previous.Children[0]->Last->TotalLength;
     return true;
   }
 
index ad1cf75392b8a06bf1e223a51ce078e55ce497e9..16471b754a3da4ea027e6c5910d41cad14917a6b 100644 (file)
@@ -2397,6 +2397,12 @@ TEST_F(FormatTest, LayoutNestedBlocks) {
                    "});",
                    getLLVMStyleWithColumns(29)));
   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
+  EXPECT_EQ("DEBUG({ // comment\n"
+            "  int i;\n"
+            "});",
+            format("DEBUG({ // comment\n"
+                   "int  i;\n"
+                   "});"));
   EXPECT_EQ("DEBUG({\n"
             "  int i;\n"
             "\n"