]> granicus.if.org Git - clang/commitdiff
clang-format: Don't remove newline if macro ends in access specifier.
authorDaniel Jasper <djasper@google.com>
Mon, 9 Mar 2015 08:13:55 +0000 (08:13 +0000)
committerDaniel Jasper <djasper@google.com>
Mon, 9 Mar 2015 08:13:55 +0000 (08:13 +0000)
I.e.:

  #define A public:

  // The new line before this line would be removed.
  int a;

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231636 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 8e6809f760849182be0df7bb800045beef9ff783..71e8b3fd6b00c940eb89defbde776504aea44aab 100644 (file)
@@ -512,7 +512,8 @@ void UnwrappedLineFormatter::formatFirstToken(FormatToken &RootToken,
     ++Newlines;
 
   // Remove empty lines after access specifiers.
-  if (PreviousLine && PreviousLine->First->isAccessSpecifier())
+  if (PreviousLine && PreviousLine->First->isAccessSpecifier() &&
+      (!PreviousLine->InPPDirective || !RootToken.HasUnescapedNewline))
     Newlines = std::min(1u, Newlines);
 
   Whitespaces->replaceWhitespace(RootToken, Newlines, IndentLevel, Indent,
index fcfe9778f3c8182ed328049b94a680280fa6b47c..7221ec898aa4ed1449c18239dfea431486bffb4b 100644 (file)
@@ -1930,6 +1930,30 @@ TEST_F(FormatTest, SeparatesLogicalBlocks) {
                    "\n"
                    "  void f();\n"
                    "};"));
+
+  // Even ensure proper spacing inside macros.
+  EXPECT_EQ("#define B     \\\n"
+            "  class A {   \\\n"
+            "   protected: \\\n"
+            "   public:    \\\n"
+            "    void f(); \\\n"
+            "  };",
+            format("#define B     \\\n"
+                   "  class A {   \\\n"
+                   "   protected: \\\n"
+                   "              \\\n"
+                   "   public:    \\\n"
+                   "              \\\n"
+                   "    void f(); \\\n"
+                   "  };",
+                   getGoogleStyle()));
+  // But don't remove empty lines after macros ending in access specifiers.
+  EXPECT_EQ("#define A private:\n"
+            "\n"
+            "int i;",
+            format("#define A         private:\n"
+                   "\n"
+                   "int              i;"));
 }
 
 TEST_F(FormatTest, FormatsClasses) {