From: Daniel Jasper Date: Sun, 20 Oct 2013 17:28:32 +0000 (+0000) Subject: clang-format: Fix formatting of nested blocks after comment. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=15eef85d4f918834ab83cfb941663463b573d6bf;p=clang clang-format: Fix formatting of nested blocks after comment. 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 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 90c3e9e96d..79244b1993 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -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::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; } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index ad1cf75392..16471b754a 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -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"