diff options
| -rw-r--r-- | clang/lib/Format/FormatToken.cpp | 10 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 14 |
2 files changed, 17 insertions, 7 deletions
diff --git a/clang/lib/Format/FormatToken.cpp b/clang/lib/Format/FormatToken.cpp index 4ca4edbe158..8ac704a3bb6 100644 --- a/clang/lib/Format/FormatToken.cpp +++ b/clang/lib/Format/FormatToken.cpp @@ -99,12 +99,15 @@ void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) { // trailing comments which are otherwise ignored for column alignment. SmallVector<unsigned, 8> EndOfLineItemLength; + bool HasNestedBracedList = false; for (unsigned i = 0, e = Commas.size() + 1; i != e; ++i) { // Skip comments on their own line. while (ItemBegin->HasUnescapedNewline && ItemBegin->isTrailingComment()) ItemBegin = ItemBegin->Next; MustBreakBeforeItem.push_back(ItemBegin->MustBreakBefore); + if (ItemBegin->is(tok::l_brace)) + HasNestedBracedList = true; const FormatToken *ItemEnd = NULL; if (i == Commas.size()) { ItemEnd = Token->MatchingParen; @@ -142,7 +145,7 @@ void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) { ColumnFormat Format; Format.Columns = Columns; Format.ColumnSizes.resize(Columns); - Format.LineCount = 0; + Format.LineCount = 1; bool HasRowWithSufficientColumns = false; unsigned Column = 0; for (unsigned i = 0, e = ItemLengths.size(); i != e; ++i) { @@ -172,6 +175,11 @@ void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) { if (Format.TotalWidth > Style.ColumnLimit) continue; + // If this braced list has nested braced list, we format it either with one + // element per line or with all elements on one line. + if (HasNestedBracedList && Columns > 1 && Format.LineCount > 1) + continue; + Formats.push_back(Format); } } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index f6e42ca211d..9b24f040d16 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1864,14 +1864,14 @@ TEST_F(FormatTest, NestedStaticInitializers) { " 333333333333333333333333333333}},\n" " {{1, 2, 3}}, {{1, 2, 3}}};"); - // FIXME: We might at some point want to handle this similar to parameter - // lists, where we have an option to put each on a single line. verifyFormat( "struct {\n" " unsigned bit;\n" " const char *const name;\n" - "} kBitsToOs[] = { { kOsMac, \"Mac\" }, { kOsWin, \"Windows\" },\n" - " { kOsLinux, \"Linux\" }, { kOsCrOS, \"Chrome OS\" } };"); + "} kBitsToOs[] = { { kOsMac, \"Mac\" },\n" + " { kOsWin, \"Windows\" },\n" + " { kOsLinux, \"Linux\" },\n" + " { kOsCrOS, \"Chrome OS\" } };"); } TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { @@ -4539,8 +4539,10 @@ TEST_F(FormatTest, FormatsBracedListsinColumnLayout) { " 1, 1, 1, 1,\n" " /**/ /**/ };", getLLVMStyleWithColumns(39)); - verifyFormat("return { { aaaaaaaaaaaaaaaaaaaaa }, { aaaaaaaaaaaaaaaaaaa },\n" - " { aaaaaaaaaaaaaaaaaaaaa }, { aaaaaaaaaaaaaaaaa } };", + verifyFormat("return { { aaaaaaaaaaaaaaaaaaaaa },\n" + " { aaaaaaaaaaaaaaaaaaa },\n" + " { aaaaaaaaaaaaaaaaaaaaa },\n" + " { aaaaaaaaaaaaaaaaa } };", getLLVMStyleWithColumns(60)); } |

