diff options
-rw-r--r-- | lib/Format/Format.cpp | 15 | ||||
-rw-r--r-- | lib/Format/TokenAnnotator.cpp | 4 | ||||
-rw-r--r-- | unittests/Format/FormatTest.cpp | 14 |
3 files changed, 26 insertions, 7 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 21f32d257c..625f93151f 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -278,9 +278,9 @@ public: LineState State; State.Column = FirstIndent; State.NextToken = &RootToken; - State.Stack.push_back( - ParenState(FirstIndent + 4, FirstIndent, !Style.BinPackParameters, - /*HasMultiParameterLine=*/ false)); + State.Stack.push_back(ParenState(FirstIndent + 4, FirstIndent, + !Style.BinPackParameters, + /*HasMultiParameterLine=*/ false)); State.VariablePos = 0; State.LineContainsContinuedForLoopSection = false; State.ParenLevel = 0; @@ -368,7 +368,7 @@ private: /// \brief The position of the colon in an ObjC method declaration/call. unsigned ColonPos; - + /// \brief Break before third operand in ternary expression. bool BreakBeforeThirdOperand; @@ -520,11 +520,14 @@ private: State.LineContainsContinuedForLoopSection = Previous.isNot(tok::semi); if (!DryRun) { + unsigned NewLines = + std::max(1u, std::min(Current.FormatTok.NewlinesBefore, + Style.MaxEmptyLinesToKeep + 1)); if (!Line.InPPDirective) - Whitespaces.replaceWhitespace(Current, 1, State.Column, + Whitespaces.replaceWhitespace(Current, NewLines, State.Column, WhitespaceStartColumn, Style); else - Whitespaces.replacePPWhitespace(Current, 1, State.Column, + Whitespaces.replacePPWhitespace(Current, NewLines, State.Column, WhitespaceStartColumn, Style); } diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index ac7301eebd..2bce7c0f34 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -266,7 +266,7 @@ private: } return true; } - + void updateParameterCount(AnnotatedToken *Left, AnnotatedToken *Current) { if (Current->is(tok::comma)) ++Left->ParameterCount; @@ -835,6 +835,8 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) { Current->Parent->is(tok::string_literal) && Current->Children[0].is(tok::string_literal)) { Current->MustBreakBefore = true; + } else if (Current->FormatTok.NewlinesBefore > 1) { + Current->MustBreakBefore = true; } else { Current->MustBreakBefore = false; } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 4fefb9627e..dba6183e09 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -576,6 +576,20 @@ TEST_F(FormatTest, CommentsInStaticInitializers) { " d, e, f },\n" " { // Group #3\n" " g, h, i } };"); + + EXPECT_EQ("S s = {\n" + " // Some comment\n" + " a\n" + "\n" + " // Comment after empty line\n" + " b\n" + "}", format("S s = {\n" + " // Some comment\n" + " a\n" + " \n" + " // Comment after empty line\n" + " b\n" + "}")); } //===----------------------------------------------------------------------===// |