From: Daniel Jasper Date: Thu, 7 Mar 2013 20:50:00 +0000 (+0000) Subject: Remove unncessary whitespace when triggered on empty line. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f302354a7d1a63186fb0d9aa600ce3257be1f690;p=clang Remove unncessary whitespace when triggered on empty line. With the cursor located at "I", clang-format would not do anything to: int a; I int b; With this patch, it reduces the number of empty lines as necessary, and removes unnecessary whitespace. It does not change/reformat "int a;" or "int b;". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176650 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 2b82410cf8..e738a5c3f3 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -1143,7 +1143,7 @@ public: /*WhitespaceStartColumn*/ 0, Style); } } else if (TheLine.Type != LT_Invalid && - (WasMoved || touchesRanges(TheLine))) { + (WasMoved || touchesLine(TheLine))) { unsigned LevelIndent = getIndent(IndentForLevel, TheLine.Level); unsigned Indent = LevelIndent; if (static_cast(Indent) + Offset >= 0) @@ -1175,7 +1175,7 @@ public: IndentForLevel[TheLine.Level] = LevelIndent; // Remove trailing whitespace of the previous line if it was touched. - if (PreviousLineWasTouched) + if (PreviousLineWasTouched || touchesEmptyLineBefore(TheLine)) formatFirstToken(TheLine.First, Indent, TheLine.InPPDirective, PreviousEndOfLineColumn); } @@ -1370,22 +1370,34 @@ private: } } - bool touchesRanges(const AnnotatedLine &TheLine) { - const FormatToken *First = &TheLine.First.FormatTok; - const FormatToken *Last = &TheLine.Last->FormatTok; - CharSourceRange LineRange = CharSourceRange::getTokenRange( - First->WhiteSpaceStart.getLocWithOffset(First->LastNewlineOffset), - Last->Tok.getLocation()); + bool touchesRanges(const CharSourceRange& Range) { for (unsigned i = 0, e = Ranges.size(); i != e; ++i) { - if (!SourceMgr.isBeforeInTranslationUnit(LineRange.getEnd(), + if (!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(), Ranges[i].getBegin()) && !SourceMgr.isBeforeInTranslationUnit(Ranges[i].getEnd(), - LineRange.getBegin())) + Range.getBegin())) return true; } return false; } + bool touchesLine(const AnnotatedLine &TheLine) { + const FormatToken *First = &TheLine.First.FormatTok; + const FormatToken *Last = &TheLine.Last->FormatTok; + CharSourceRange LineRange = CharSourceRange::getTokenRange( + First->WhiteSpaceStart.getLocWithOffset(First->LastNewlineOffset), + Last->Tok.getLocation()); + return touchesRanges(LineRange); + } + + bool touchesEmptyLineBefore(const AnnotatedLine &TheLine) { + const FormatToken *First = &TheLine.First.FormatTok; + CharSourceRange LineRange = CharSourceRange::getCharRange( + First->WhiteSpaceStart, + First->WhiteSpaceStart.getLocWithOffset(First->LastNewlineOffset)); + return touchesRanges(LineRange); + } + virtual void consumeUnwrappedLine(const UnwrappedLine &TheLine) { AnnotatedLines.push_back(AnnotatedLine(TheLine)); } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index eafc4c8512..1e92592488 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -194,6 +194,13 @@ TEST_F(FormatTest, FormatsCorrectRegionForLeadingWhitespace) { 25, 0, getLLVMStyleWithColumns(12))); } +TEST_F(FormatTest, RemovesWhitespaceWhenTriggeredOnEmptyLine) { + EXPECT_EQ("int a;\n\n int b;", + format("int a;\n \n\n int b;", 7, 0, getLLVMStyle())); + EXPECT_EQ("int a;\n\n int b;", + format("int a;\n \n\n int b;", 9, 0, getLLVMStyle())); +} + TEST_F(FormatTest, ReformatsMovedLines) { EXPECT_EQ( "template T *getFETokenInfo() const {\n"