From 77258921c2916416381c288a676d97565a3aac84 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Wed, 4 Jun 2014 12:40:57 +0000 Subject: [PATCH] clang-format: Leave empty lines within UnwrappedLines. These are commonly used to structure things like enums or long braced lists. There doesn't seem to be a good reason to have the behavior in such structures be different from the behavior between statements. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210183 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/ContinuationIndenter.cpp | 6 ++---- lib/Format/TokenAnnotator.cpp | 2 ++ unittests/Format/FormatTest.cpp | 30 +++++++++++++++++++++++------ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index 5e63d0cb9b..308fc623d8 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -413,10 +413,8 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State, State.Stack.back().BreakBeforeParameter = true; if (!DryRun) { - unsigned Newlines = 1; - if (Current.is(tok::comment)) - Newlines = std::max(Newlines, std::min(Current.NewlinesBefore, - Style.MaxEmptyLinesToKeep + 1)); + unsigned Newlines = std::max( + 1u, std::min(Current.NewlinesBefore, Style.MaxEmptyLinesToKeep + 1)); Whitespaces.replaceWhitespace(Current, Newlines, State.Stack.back().IndentLevel, State.Column, State.Column, State.Line->InPPDirective); diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index cbb9d7f964..a61c6b880d 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -1591,6 +1591,8 @@ static bool isAllmanBrace(const FormatToken &Tok) { bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, const FormatToken &Right) { const FormatToken &Left = *Right.Previous; + if (Right.NewlinesBefore > 1) + return true; if (Right.is(tok::comment)) { return Right.Previous->BlockKind != BK_BracedInit && Right.Previous->Type != TT_CtorInitializerColon && diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 40789640e2..cf5c9ff1ef 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -1884,6 +1884,22 @@ TEST_F(FormatTest, FormatsEnum) { verifyFormat("enum ShortEnum { A, B, C };"); verifyGoogleFormat("enum ShortEnum { A, B, C };"); + + EXPECT_EQ("enum KeepEmptyLines {\n" + " ONE,\n" + "\n" + " TWO,\n" + "\n" + " THREE\n" + "}", + format("enum KeepEmptyLines {\n" + " ONE,\n" + "\n" + " TWO,\n" + "\n" + "\n" + " THREE\n" + "}")); } TEST_F(FormatTest, FormatsEnumsWithErrors) { @@ -2149,11 +2165,14 @@ TEST_F(FormatTest, StaticInitializers) { // Here, everything other than the "}" would fit on a line. verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n" " 10000000000000000000000000};"); - EXPECT_EQ("S s = {a, b};", format("S s = {\n" - " a,\n" - "\n" - " b\n" - "};")); + EXPECT_EQ("S s = {a,\n" + "\n" + " b};", + format("S s = {\n" + " a,\n" + "\n" + " b\n" + "};")); // FIXME: This would fit into the column limit if we'd fit "{ {" on the first // line. However, the formatting looks a bit off and this probably doesn't @@ -2457,7 +2476,6 @@ TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { "};", format("class A : public QObject {\n" " Q_Object\n" - "\n" " A() {\n}\n" "} ;")); } -- 2.40.0