]> granicus.if.org Git - clang/commitdiff
Remove unncessary whitespace when triggered on empty line.
authorDaniel Jasper <djasper@google.com>
Thu, 7 Mar 2013 20:50:00 +0000 (20:50 +0000)
committerDaniel Jasper <djasper@google.com>
Thu, 7 Mar 2013 20:50:00 +0000 (20:50 +0000)
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

lib/Format/Format.cpp
unittests/Format/FormatTest.cpp

index 2b82410cf87bb25ba07e67429a79af4a547d24a2..e738a5c3f3f3c1cdc4a6cb7837dd269b5bed865e 100644 (file)
@@ -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<int>(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));
   }
index eafc4c8512216448f6beae978047b30aedec1a4b..1e925924883e465cdc9d21e42269570063f38928 100644 (file)
@@ -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 <typename T> T *getFETokenInfo() const {\n"