MyDeveloperDay updated this revision to Diff 413288. MyDeveloperDay added a comment.
Add more producers CHANGES SINCE LAST ACTION https://reviews.llvm.org/D121069/new/ https://reviews.llvm.org/D121069 Files: clang/lib/Format/WhitespaceManager.cpp clang/lib/Format/WhitespaceManager.h clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -25298,6 +25298,66 @@ verifyFormat("#define A x%:%:y"); } +TEST_F(FormatTest, AlignArrayOfStructuresLeftAlignmentNonSquare) { + auto Style = getLLVMStyle(); + Style.AlignArrayOfStructures = FormatStyle::AIAS_Left; + Style.AlignConsecutiveAssignments = + FormatStyle::AlignConsecutiveStyle::ACS_Consecutive; + Style.AlignConsecutiveDeclarations = + FormatStyle::AlignConsecutiveStyle::ACS_Consecutive; + + // TODO don't adjust this non square array + verifyFormat("struct test demo[] = {\n" + " {1, 2},\n" + " {3, 4, 5},\n" + " {6, 7, 8}\n" + "};\n", + Style); + + verifyFormat("S{\n" + " {},\n" + " {},\n" + " {a, b}\n" + "};\n", + Style); + verifyFormat("S{\n" + " {},\n" + " {},\n" + " {a, b},\n" + "};\n", + Style); +} + +TEST_F(FormatTest, AlignArrayOfStructuresRightAlignmentNonSquare) { + auto Style = getLLVMStyle(); + Style.AlignArrayOfStructures = FormatStyle::AIAS_Right; + Style.AlignConsecutiveAssignments = + FormatStyle::AlignConsecutiveStyle::ACS_Consecutive; + Style.AlignConsecutiveDeclarations = + FormatStyle::AlignConsecutiveStyle::ACS_Consecutive; + + // TODO don't adjust this non square array + verifyFormat("struct test demo[] = {\n" + " {1, 2, 3},\n" + " {3, 4, 5},\n" + " {6, 7, 8}\n" + "};\n", + Style); + + verifyFormat("S{\n" + " {},\n" + " {},\n" + " {a, b}\n" + "};\n", + Style); + verifyFormat("S{\n" + " {},\n" + " {},\n" + " {a, b},\n" + "};\n", + Style); +} + } // namespace } // namespace format } // namespace clang Index: clang/lib/Format/WhitespaceManager.h =================================================================== --- clang/lib/Format/WhitespaceManager.h +++ clang/lib/Format/WhitespaceManager.h @@ -196,8 +196,21 @@ struct CellDescriptions { SmallVector<CellDescription> Cells; - unsigned CellCount = 0; + SmallVector<unsigned> CellCounts; unsigned InitialSpaces = 0; + + // Determine if the array is "Square" i.e. every row has the same number + // of columns as the first row + bool IsSquare() { + if (CellCounts.empty()) + return false; + + for (auto NumberOfColumns : CellCounts) { + if (NumberOfColumns != CellCounts[0]) + return false; + } + return true; + } }; /// Calculate \c IsTrailingComment, \c TokenLength for the last tokens Index: clang/lib/Format/WhitespaceManager.cpp =================================================================== --- clang/lib/Format/WhitespaceManager.cpp +++ clang/lib/Format/WhitespaceManager.cpp @@ -1032,11 +1032,13 @@ void WhitespaceManager::alignArrayInitializersRightJustified( CellDescriptions &&CellDescs) { + if (!CellDescs.IsSquare()) + return; + auto &Cells = CellDescs.Cells; - // Now go through and fixup the spaces. auto *CellIter = Cells.begin(); - for (auto i = 0U; i < CellDescs.CellCount; ++i, ++CellIter) { + for (auto i = 0U; i < CellDescs.CellCounts[0]; ++i, ++CellIter) { unsigned NetWidth = 0U; if (isSplitCell(*CellIter)) NetWidth = getNetWidth(Cells.begin(), CellIter, CellDescs.InitialSpaces); @@ -1060,14 +1062,14 @@ getNetWidth(Cells.begin(), CellIter, CellDescs.InitialSpaces); auto MaxNetWidth = getMaximumNetWidth(Cells.begin(), CellIter, CellDescs.InitialSpaces, - CellDescs.CellCount); + CellDescs.CellCounts[0]); if (ThisNetWidth < MaxNetWidth) Changes[CellIter->Index].Spaces = (MaxNetWidth - ThisNetWidth); auto RowCount = 1U; auto Offset = std::distance(Cells.begin(), CellIter); for (const auto *Next = CellIter->NextColumnElement; Next != nullptr; Next = Next->NextColumnElement) { - auto *Start = (Cells.begin() + RowCount * CellDescs.CellCount); + auto *Start = (Cells.begin() + RowCount * CellDescs.CellCounts[RowCount]); auto *End = Start + Offset; ThisNetWidth = getNetWidth(Start, End, CellDescs.InitialSpaces); if (ThisNetWidth < MaxNetWidth) @@ -1100,8 +1102,10 @@ void WhitespaceManager::alignArrayInitializersLeftJustified( CellDescriptions &&CellDescs) { + if (!CellDescs.IsSquare()) + return; + auto &Cells = CellDescs.Cells; - // Now go through and fixup the spaces. auto *CellIter = Cells.begin(); // The first cell needs to be against the left brace. @@ -1110,9 +1114,9 @@ else Changes[CellIter->Index].Spaces = CellDescs.InitialSpaces; ++CellIter; - for (auto i = 1U; i < CellDescs.CellCount; i++, ++CellIter) { + for (auto i = 1U; i < CellDescs.CellCounts[0]; i++, ++CellIter) { auto MaxNetWidth = getMaximumNetWidth( - Cells.begin(), CellIter, CellDescs.InitialSpaces, CellDescs.CellCount); + Cells.begin(), CellIter, CellDescs.InitialSpaces, CellDescs.CellCounts[0]); auto ThisNetWidth = getNetWidth(Cells.begin(), CellIter, CellDescs.InitialSpaces); if (Changes[CellIter->Index].NewlinesBefore == 0) { @@ -1124,7 +1128,7 @@ auto Offset = std::distance(Cells.begin(), CellIter); for (const auto *Next = CellIter->NextColumnElement; Next != nullptr; Next = Next->NextColumnElement) { - auto *Start = (Cells.begin() + RowCount * CellDescs.CellCount); + auto *Start = (Cells.begin() + RowCount * CellDescs.CellCounts[RowCount]); auto *End = Start + Offset; auto ThisNetWidth = getNetWidth(Start, End, CellDescs.InitialSpaces); if (Changes[Next->Index].NewlinesBefore == 0) { @@ -1152,7 +1156,7 @@ unsigned Depth = 0; unsigned Cell = 0; - unsigned CellCount = 0; + SmallVector<unsigned> CellCounts; unsigned InitialSpaces = 0; unsigned InitialTokenLength = 0; unsigned EndSpaces = 0; @@ -1192,7 +1196,7 @@ if (!Cells.empty()) Cells.back().EndIndex = i; Cells.push_back(CellDescription{i, ++Cell, i + 1, false, nullptr}); - CellCount = C.Tok->Previous->isNot(tok::comma) ? Cell + 1 : Cell; + CellCounts.push_back(C.Tok->Previous->isNot(tok::comma) ? Cell + 1 : Cell); // Go to the next non-comment and ensure there is a break in front const auto *NextNonComment = C.Tok->getNextNonComment(); while (NextNonComment->is(tok::comma)) @@ -1262,7 +1266,7 @@ } } - return linkCells({Cells, CellCount, InitialSpaces}); + return linkCells({Cells, CellCounts, InitialSpaces}); } unsigned WhitespaceManager::calculateCellWidth(unsigned Start, unsigned End,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits