Author: alexfh Date: Wed Dec 4 06:21:08 2013 New Revision: 196378 URL: http://llvm.org/viewvc/llvm-project?rev=196378&view=rev Log: Leave constructor initializer lists on one line in styles with no column limit.
Summary: Allow tryFitMultipleLinesInOne join unwrapped lines when ContinuationIndenter::mustBreak doesn't agree. But don't merge any lines, that are separate in the input. Reviewers: djasper Reviewed By: djasper CC: cfe-commits, klimek Differential Revision: http://llvm-reviews.chandlerc.com/D2321 Modified: cfe/trunk/lib/Format/Format.cpp cfe/trunk/unittests/Format/FormatTest.cpp Modified: cfe/trunk/lib/Format/Format.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=196378&r1=196377&r2=196378&view=diff ============================================================================== --- cfe/trunk/lib/Format/Format.cpp (original) +++ cfe/trunk/lib/Format/Format.cpp Wed Dec 4 06:21:08 2013 @@ -439,12 +439,13 @@ public: /// \brief Formats the line starting at \p State, simply keeping all of the /// input's line breaking decisions. - void format(unsigned FirstIndent, const AnnotatedLine *Line) { + void format(unsigned FirstIndent, const AnnotatedLine *Line, + bool LineIsMerged) { LineState State = Indenter->getInitialState(FirstIndent, Line, /*DryRun=*/false); while (State.NextToken != NULL) { bool Newline = - Indenter->mustBreak(State) || + (!LineIsMerged && Indenter->mustBreak(State)) || (Indenter->canBreak(State) && State.NextToken->NewlinesBefore > 0); Indenter->addTokenToState(State, Newline, /*DryRun=*/false); } @@ -468,9 +469,6 @@ public: if (TheLine->Last->Type == TT_LineComment) return 0; - if (Indent > Style.ColumnLimit) - return 0; - unsigned Limit = Style.ColumnLimit == 0 ? UINT_MAX : Style.ColumnLimit - Indent; // If we already exceed the column limit, we set 'Limit' to 0. The different @@ -479,6 +477,9 @@ public: ? 0 : Limit - TheLine->Last->TotalLength; + if (Indent > Limit) + return 0; + if (I + 1 == E || I[1]->Type == LT_Invalid) return 0; @@ -658,6 +659,14 @@ public: if (static_cast<int>(Indent) + Offset >= 0) Indent += Offset; unsigned MergedLines = Joiner.tryFitMultipleLinesInOne(Indent, I, E); + if (MergedLines > 0 && Style.ColumnLimit == 0) { + // Disallow line merging if there is a break at the start of one of the + // input lines. + for (unsigned i = 0; i < MergedLines; ++i) { + if (I[i + 1]->First->NewlinesBefore > 0) + MergedLines = 0; + } + } if (!DryRun) { for (unsigned i = 0; i < MergedLines; ++i) { join(*I[i], *I[i + 1]); @@ -702,7 +711,8 @@ public: // FIXME: Implement nested blocks for ColumnLimit = 0. NoColumnLimitFormatter Formatter(Indenter); if (!DryRun) - Formatter.format(Indent, &TheLine); + Formatter.format(Indent, &TheLine, + /*LineIsMerged=*/MergedLines > 0); } else { Penalty += format(TheLine, Indent, DryRun); } Modified: cfe/trunk/unittests/Format/FormatTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=196378&r1=196377&r2=196378&view=diff ============================================================================== --- cfe/trunk/unittests/Format/FormatTest.cpp (original) +++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Dec 4 06:21:08 2013 @@ -4891,6 +4891,28 @@ TEST_F(FormatTest, PullTrivialFunctionDe verifyFormat("void f() {}", getLLVMStyleWithColumns(11)); verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10)); + + FormatStyle NoColumnLimit = getLLVMStyle(); + NoColumnLimit.ColumnLimit = 0; + EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit)); + EXPECT_EQ("class C {\n" + " A() : b(0) {}\n" + "};", format("class C{A():b(0){}};", NoColumnLimit)); + EXPECT_EQ("A()\n" + " : b(0) {\n" + "}", + format("A()\n:b(0)\n{\n}", NoColumnLimit)); + + FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit; + DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine = false; + EXPECT_EQ("A()\n" + " : b(0) {\n" + "}", + format("A():b(0){}", DoNotMergeNoColumnLimit)); + EXPECT_EQ("A()\n" + " : b(0) {\n" + "}", + format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit)); } TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { @@ -7340,12 +7362,18 @@ TEST_F(FormatTest, FormatsWithWebKitStyl // Constructor initializers are formatted one per line with the "," on the // new line. - verifyFormat("Constructor()\n" - " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" - " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" - " aaaaaaaaaaaaaa)\n" - " , aaaaaaaaaaaaaaaaaaaaaaa() {}", - Style); + EXPECT_EQ( + "Constructor()\n" + " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" + " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" + " aaaaaaaaaaaaaa)\n" + " , aaaaaaaaaaaaaaaaaaaaaaa() {}", + format("Constructor()\n" + " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" + " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" + " aaaaaaaaaaaaaa)\n" + " , aaaaaaaaaaaaaaaaaaaaaaa() {}", + Style)); // Access specifiers should be aligned left. verifyFormat("class C {\n" _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
