Max_S updated this revision to Diff 329574.
Max_S added a comment.
Updating D98237 <https://reviews.llvm.org/D98237>: [clang-format] Option for
empty lines after an access modifier.
- Added additional verification tests
- Added expected formating tests
- Changed comment to reflect the new logic
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98237/new/
https://reviews.llvm.org/D98237
Files:
clang/docs/ClangFormatStyleOptions.rst
clang/include/clang/Format/Format.h
clang/lib/Format/Format.cpp
clang/lib/Format/UnwrappedLineFormatter.cpp
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -9179,6 +9179,48 @@
Style);
}
+TEST_F(FormatTest, FormatsAfterAccessModifiers) {
+ char const* const test0NL =
+ "class Foo {\n"
+ "private: int i;\n"
+ "};";
+ char const* const test1NL =
+ "class Foo {\n"
+ "private:\n"
+ " int i;\n"
+ "};";
+ char const* const test2NL =
+ "class Foo {\n"
+ "private:\n"
+ "\n"
+ " int i;\n"
+ "};";
+ char const* const test3NL =
+ "class Foo {\n"
+ "private:\n"
+ "\n"
+ "\n"
+ " int i;\n"
+ "};";
+ EXPECT_EQ(test1NL, format(test0NL));
+ verifyFormat(test1NL);
+ EXPECT_EQ(test1NL, format(test2NL));
+ EXPECT_EQ(test1NL, format(test3NL));
+
+ FormatStyle StyleWithLine = getLLVMStyle();
+ StyleWithLine.EmptyLinesAfterAccessModifier = 1u;
+ EXPECT_EQ(test2NL, format(test0NL, StyleWithLine));
+ EXPECT_EQ(test2NL, format(test1NL, StyleWithLine));
+ verifyFormat(test2NL, StyleWithLine);
+ EXPECT_EQ(test2NL, format(test3NL, StyleWithLine));
+
+ StyleWithLine.EmptyLinesAfterAccessModifier = 2u;
+ EXPECT_EQ(test3NL, format(test0NL, StyleWithLine));
+ EXPECT_EQ(test3NL, format(test1NL, StyleWithLine));
+ EXPECT_EQ(test3NL, format(test2NL, StyleWithLine));
+ verifyFormat(test3NL, StyleWithLine);
+}
+
TEST_F(FormatTest, FormatsArrays) {
verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
" [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Index: clang/lib/Format/UnwrappedLineFormatter.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineFormatter.cpp
+++ clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -1278,10 +1278,10 @@
}
}
- // Remove empty lines after access specifiers.
+ // Force the configured amount of new lines after an access specifier
if (PreviousLine && PreviousLine->First->isAccessSpecifier() &&
(!PreviousLine->InPPDirective || !RootToken.HasUnescapedNewline))
- Newlines = std::min(1u, Newlines);
+ Newlines = Style.EmptyLinesAfterAccessModifier + 1u;
if (Newlines)
Indent = NewlineIndent;
Index: clang/lib/Format/Format.cpp
===================================================================
--- clang/lib/Format/Format.cpp
+++ clang/lib/Format/Format.cpp
@@ -586,6 +586,8 @@
IO.mapOptional("DisableFormat", Style.DisableFormat);
IO.mapOptional("EmptyLineBeforeAccessModifier",
Style.EmptyLineBeforeAccessModifier);
+ IO.mapOptional("EmptyLinesAfterAccessModifier",
+ Style.EmptyLinesAfterAccessModifier);
IO.mapOptional("ExperimentalAutoDetectBinPacking",
Style.ExperimentalAutoDetectBinPacking);
IO.mapOptional("FixNamespaceComments", Style.FixNamespaceComments);
@@ -975,6 +977,7 @@
LLVMStyle.DeriveLineEnding = true;
LLVMStyle.DerivePointerAlignment = false;
LLVMStyle.EmptyLineBeforeAccessModifier = FormatStyle::ELBAMS_LogicalBlock;
+ LLVMStyle.EmptyLinesAfterAccessModifier = 0u;
LLVMStyle.ExperimentalAutoDetectBinPacking = false;
LLVMStyle.FixNamespaceComments = true;
LLVMStyle.ForEachMacros.push_back("foreach");
Index: clang/include/clang/Format/Format.h
===================================================================
--- clang/include/clang/Format/Format.h
+++ clang/include/clang/Format/Format.h
@@ -1953,6 +1953,9 @@
/// Defines in which cases to put empty line before access modifiers.
EmptyLineBeforeAccessModifierStyle EmptyLineBeforeAccessModifier;
+ /// Defines how many lines are put after access modifiers.
+ unsigned EmptyLinesAfterAccessModifier;
+
/// If ``true``, clang-format detects whether function calls and
/// definitions are formatted with one parameter per line.
///
@@ -3201,6 +3204,7 @@
DerivePointerAlignment == R.DerivePointerAlignment &&
DisableFormat == R.DisableFormat &&
EmptyLineBeforeAccessModifier == R.EmptyLineBeforeAccessModifier &&
+ EmptyLinesAfterAccessModifier == R.EmptyLinesAfterAccessModifier &&
ExperimentalAutoDetectBinPacking ==
R.ExperimentalAutoDetectBinPacking &&
FixNamespaceComments == R.FixNamespaceComments &&
Index: clang/docs/ClangFormatStyleOptions.rst
===================================================================
--- clang/docs/ClangFormatStyleOptions.rst
+++ clang/docs/ClangFormatStyleOptions.rst
@@ -2195,7 +2195,17 @@
protected:
};
+**EmptyLinesAfterAccessModifier** (``unsigned``)
+ Defines how many lines are put after access modifiers.
+ .. code-block:: c++
+
+ 0: 1:
+ struct Foo { vs. struct Foo {
+ private: private:
+ int x;
+ }; int x;
+ };
**ExperimentalAutoDetectBinPacking** (``bool``)
If ``true``, clang-format detects whether function calls and
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits