From: Daniel Jasper Date: Mon, 9 Dec 2013 14:40:19 +0000 (+0000) Subject: clang-format: Be more conservative about braced list column layout. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9c009bca6da945074f0d5d496bd87da13e20eaea;p=clang clang-format: Be more conservative about braced list column layout. Specifically disable it for nested braced lists as it commonly can look really weird. Eventually, we'll want to become smarter and format some of the nested lists better. Before: SomeStruct my_struct_array = { { aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaa, aaa }, { aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa }, { aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa }, }; After: SomeStruct my_struct_array = { { aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaa, aaaaaaa, aaa }, { aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa }, { aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa }, }; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196783 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/FormatToken.cpp b/lib/Format/FormatToken.cpp index 748e2fd84a..16600f24ee 100644 --- a/lib/Format/FormatToken.cpp +++ b/lib/Format/FormatToken.cpp @@ -92,7 +92,8 @@ static unsigned CodePointsBetween(const FormatToken *Begin, void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) { // FIXME: At some point we might want to do this for other lists, too. - if (!Token->MatchingParen || Token->isNot(tok::l_brace)) + if (!Token->MatchingParen || Token->isNot(tok::l_brace) || + Token->NestingLevel != 0) return; FormatToken *ItemBegin = Token->Next; diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h index a8d54ef264..fa676b3973 100644 --- a/lib/Format/FormatToken.h +++ b/lib/Format/FormatToken.h @@ -97,8 +97,8 @@ struct FormatToken { BlockKind(BK_Unknown), Type(TT_Unknown), SpacesRequiredBefore(0), CanBreakBefore(false), ClosesTemplateDeclaration(false), ParameterCount(0), PackingKind(PPK_Inconclusive), TotalLength(0), - UnbreakableTailLength(0), BindingStrength(0), SplitPenalty(0), - LongestObjCSelectorName(0), FakeRParens(0), + UnbreakableTailLength(0), BindingStrength(0), NestingLevel(0), + SplitPenalty(0), LongestObjCSelectorName(0), FakeRParens(0), StartsBinaryExpression(false), EndsBinaryExpression(false), LastInChainOfCalls(false), PartOfMultiVariableDeclStmt(false), MatchingParen(NULL), Previous(NULL), Next(NULL), @@ -207,6 +207,10 @@ struct FormatToken { /// operator precedence, parenthesis nesting, etc. unsigned BindingStrength; + /// \brief The nesting level of this token, i.e. the number of surrounding (), + /// [], {} or <>. + unsigned NestingLevel; + /// \brief Penalty for inserting a line break before this token. unsigned SplitPenalty; diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index d4880a472d..d22facb922 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -529,6 +529,7 @@ private: if (CurrentToken != NULL) { determineTokenType(*CurrentToken); CurrentToken->BindingStrength = Contexts.back().BindingStrength; + CurrentToken->NestingLevel = Contexts.size() - 1; } if (CurrentToken != NULL) @@ -1141,8 +1142,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, return 3; if (Left.Type == TT_StartOfName) return 20; - if (InFunctionDecl && Right.BindingStrength == 1) - // FIXME: Clean up hack of using BindingStrength to find top-level names. + if (InFunctionDecl && Right.NestingLevel == 0) return Style.PenaltyReturnTypeOnItsOwnLine; return 200; } @@ -1396,9 +1396,8 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, return true; } else if (Right.Previous->ClosesTemplateDeclaration && Right.Previous->MatchingParen && - Right.Previous->MatchingParen->BindingStrength == 1 && + Right.Previous->MatchingParen->NestingLevel == 0 && Style.AlwaysBreakTemplateDeclarations) { - // FIXME: Fix horrible hack of using BindingStrength to find top-level <>. return true; } else if (Right.Type == TT_CtorInitializerComma && Style.BreakConstructorInitializersBeforeComma && diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 2860bbbedd..e2f8d2fa65 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -4854,6 +4854,17 @@ TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { " { aaaaaaaaaaaaaaaaaaaaa },\n" " { aaaaaaaaaaaaaaaaa } };", getLLVMStyleWithColumns(60)); + + // No column layout for nested lists. + // FIXME: For some nested lists, we can do better. + verifyFormat( + "SomeStruct my_struct_array = {\n" + " { aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n" + " aaaaaaaaaaaaa, aaaaaaa, aaa },\n" + " { aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa },\n" + " { aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa },\n" + "};"); } TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {