From: Daniel Jasper Date: Sun, 6 Oct 2013 11:40:08 +0000 (+0000) Subject: clang-format: Remove empty lines after visibility modifiers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=63cfb89cf75300b62f3aa1debaa44a4a1ce83b45;p=clang clang-format: Remove empty lines after visibility modifiers. Formatting: class C { public: f(); }; Now leads to: class C { public: f(); }; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192062 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 8ee770af95..129c119532 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -832,7 +832,7 @@ public: std::vector IndentForLevel; bool PreviousLineWasTouched = false; - const FormatToken *PreviousLineLastToken = 0; + const AnnotatedLine *PreviousLine = NULL; bool FormatPPDirective = false; for (SmallVectorImpl::iterator I = AnnotatedLines.begin(), E = AnnotatedLines.end(); @@ -872,7 +872,7 @@ public: // Insert a break even if there is a structural error in case where // we break apart a line consisting of multiple unwrapped lines. (FirstTok->NewlinesBefore == 0 || !StructuralError)) { - formatFirstToken(*TheLine.First, PreviousLineLastToken, Indent, + formatFirstToken(*TheLine.First, PreviousLine, Indent, TheLine.InPPDirective); } else { Indent = LevelIndent = FirstTok->OriginalColumn; @@ -914,7 +914,7 @@ public: // Remove trailing whitespace of the previous line if it was // touched. if (PreviousLineWasTouched || touchesEmptyLineBefore(TheLine)) { - formatFirstToken(*Tok, PreviousLineLastToken, LevelIndent, + formatFirstToken(*Tok, PreviousLine, LevelIndent, TheLine.InPPDirective); } else { Whitespaces.addUntouchableToken(*Tok, TheLine.InPPDirective); @@ -933,7 +933,7 @@ public: // last token. PreviousLineWasTouched = false; } - PreviousLineLastToken = TheLine.Last; + PreviousLine = *I; } return Whitespaces.generateReplacements(); } @@ -1222,7 +1222,7 @@ private: /// of the \c UnwrappedLine if there was no structural parsing error. /// Returns the indent level of the \c UnwrappedLine. void formatFirstToken(const FormatToken &RootToken, - const FormatToken *PreviousToken, unsigned Indent, + const AnnotatedLine *PreviousLine, unsigned Indent, bool InPPDirective) { unsigned Newlines = std::min(RootToken.NewlinesBefore, Style.MaxEmptyLinesToKeep + 1); @@ -1235,10 +1235,14 @@ private: Newlines = 1; // Insert extra new line before access specifiers. - if (PreviousToken && PreviousToken->isOneOf(tok::semi, tok::r_brace) && + if (PreviousLine && PreviousLine->Last->isOneOf(tok::semi, tok::r_brace) && RootToken.isAccessSpecifier() && RootToken.NewlinesBefore == 1) ++Newlines; + // Remove empty lines after access specifiers. + if (PreviousLine && PreviousLine->First->isAccessSpecifier()) + Newlines = std::min(1u, Newlines); + Whitespaces.replaceWhitespace( RootToken, Newlines, Indent / Style.IndentWidth, Indent, Indent, InPPDirective && !RootToken.HasUnescapedNewline); diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index dfdeae1a1e..85813bcaff 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -1492,6 +1492,18 @@ TEST_F(FormatTest, SeparatesLogicalBlocks) { "protected:\n" "int h;\n" "};")); + EXPECT_EQ("class A {\n" + "protected:\n" + "public:\n" + " void f();\n" + "};", + format("class A {\n" + "protected:\n" + "\n" + "public:\n" + "\n" + " void f();\n" + "};")); } TEST_F(FormatTest, FormatsClasses) {