[clang] [clang-format] Add new option: WrapNamespaceBodyWithNewlines (PR #106145)

Owen Pan via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 2 09:45:29 PST 2025


================
@@ -28427,6 +28427,136 @@ TEST_F(FormatTest, ShortNamespacesOption) {
       Style);
 }
 
+TEST_F(FormatTest, WrapNamespaceBodyWithEmptyLinesNever) {
+  auto Style = getLLVMStyle();
+  Style.FixNamespaceComments = false;
+  Style.WrapNamespaceBodyWithEmptyLines = FormatStyle::WNBWELS_Never;
+
+  // Empty namespace.
+  verifyFormat("namespace N {}", Style);
+
+  // Single namespace.
+  verifyFormat("namespace N {\n"
+               "int f1(int a) { return 2 * a; }\n"
+               "}",
+               Style);
+
+  // Nested namespace.
+  verifyFormat("namespace N1 {\n"
+               "namespace N2 {\n"
+               "int a = 1;\n"
+               "}\n"
+               "}",
+               Style);
+
+  Style.CompactNamespaces = true;
+
+  verifyFormat("namespace N1 { namespace N2 {\n"
+               "int a = 1;\n"
+               "}}",
+               Style);
+
+  // Removing empty lines.
+  verifyFormat("namespace N {\n"
+               "int a = 1;\n"
+               "}",
+               "namespace N {\n"
+               "\n"
+               "\n"
+               "int a = 1;\n"
+               "\n"
+               "\n"
+               "}",
+               Style);
+
+  Style.MaxEmptyLinesToKeep = 0;
+
+  verifyFormat("namespace N {\n"
+               "int a = 1;\n"
+               "}",
+               "namespace N {\n"
+               "\n"
+               "\n"
+               "int a = 1;\n"
+               "\n"
+               "\n"
+               "}",
+               Style);
+}
+
+TEST_F(FormatTest, WrapNamespaceBodyWithEmptyLinesAlways) {
+  auto Style = getLLVMStyle();
+  Style.FixNamespaceComments = false;
+  Style.WrapNamespaceBodyWithEmptyLines = FormatStyle::WNBWELS_Always;
+
+  // Empty namespace.
+  verifyFormat("namespace N {}", Style);
+
+  // Single namespace.
+  verifyFormat("namespace N {\n"
+               "\n"
+               "int f1(int a) { return 2 * a; }\n"
+               "\n"
+               "}",
+               Style);
+
+  // Nested namespace.
+  verifyFormat("namespace N1 {\n"
+               "namespace N2 {\n"
+               "\n"
+               "int a = 1;\n"
+               "\n"
+               "}\n"
+               "}",
+               Style);
+
+  Style.CompactNamespaces = true;
+
+  // Nested namespace.
+  verifyFormat("namespace N1 { namespace N2 {\n"
+               "\n"
+               "int a = 1;\n"
+               "\n"
+               "}}",
+               Style);
+
+  Style.MaxEmptyLinesToKeep = 2;
+
+  // Nested namespace.
+  verifyNoChange("namespace N1 { namespace N2 {\n"
+                 "\n"
+                 "\n"
+                 "int a = 1;\n"
+                 "\n"
+                 "\n"
+                 "}}",
+                 Style);
+
+  Style.CompactNamespaces = false;
+
+  // Single namespace.
+  verifyNoChange("namespace N {\n"
+                 "\n"
+                 "\n"
+                 "int a = 1;\n"
+                 "\n"
+                 "\n"
+                 "}",
+                 Style);
+
+  // Nested namespace.
+  verifyNoChange("namespace N1 {\n"
+                 "namespace N2 {\n"
+                 "\n"
+                 "\n"
+                 "int a = 1;\n"
+                 "\n"
+                 "\n"
+                 "}\n"
+                 "}",
+                 Style);
----------------
owenca wrote:

```suggestion
  Style.FixNamespaceComments = false;
  Style.MaxEmptyLinesToKeep = 2;
  Style.WrapNamespaceBodyWithEmptyLines = FormatStyle::WNBWELS_Always;

  // Empty namespace.
  verifyFormat("namespace N {}", Style);

  // Single namespace.
  verifyFormat("namespace N {\n"
               "\n"
               "int f1(int a) { return 2 * a; }\n"
               "\n"
               "}",
               "namespace N {\n"
               "int f1(int a) { return 2 * a; }\n"
               "}",
               Style);

  // Nested namespace.
  verifyFormat("namespace N1 {\n"
               "namespace N2 {\n"
               "\n"
               "int a = 1;\n"
               "\n"
               "}\n"
               "}",
               "namespace N1 {\n"
               "namespace N2 {\n"
               "int a = 1;\n"
               "}\n"
               "}",
               Style);

  verifyFormat("namespace N1 {\n"
               "\n"
               "namespace N2 {\n"
               "\n"
               "\n"
               "int a = 1;\n"
               "\n"
               "\n"
               "}\n"
               "\n"
               "}",
               "namespace N1 {\n"
               "\n"
               "namespace N2 {\n"
               "\n"
               "\n"
               "\n"
               "int a = 1;\n"
               "\n"
               "\n"
               "\n"
               "}\n"
               "\n"
               "}",
               Style);

  Style.CompactNamespaces = true;

  verifyFormat("namespace N1 { namespace N2 {\n"
               "\n"
               "int a = 1;\n"
               "\n"
               "}}",
               "namespace N1 { namespace N2 {\n"
               "int a = 1;\n"
               "}}",
               Style);
```
Ditto.

https://github.com/llvm/llvm-project/pull/106145


More information about the cfe-commits mailing list