[clang] 906b9db - [clang-format] Improve BAS_DontAlign+AllowAllArgumentsOnNextLine=false
Alex Richardson via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 2 09:53:52 PST 2020
Author: Alex Richardson
Date: 2020-11-02T17:52:37Z
New Revision: 906b9dbc9d7487ee923b6a516c36777a2be0ca35
URL: https://github.com/llvm/llvm-project/commit/906b9dbc9d7487ee923b6a516c36777a2be0ca35
DIFF: https://github.com/llvm/llvm-project/commit/906b9dbc9d7487ee923b6a516c36777a2be0ca35.diff
LOG: [clang-format] Improve BAS_DontAlign+AllowAllArgumentsOnNextLine=false
TokenAnnotator::splitPenalty() was always returning 0 for opening parens if
AlignAfterOpenBracket was set to BAS_DontAlign, so the preferred point for
line breaking was always after the open paren (and was ignoring
PenaltyBreakBeforeFirstCallParameter). This change restricts the zero
penalty to the AllowAllArgumentsOnNextLine case. This results in improved
formatting for FreeBSD where we set AllowAllArgumentsOnNextLine: false
and a high value for PenaltyBreakBeforeFirstCallParameter to avoid breaking
after the open paren.
Before:
```
functionCall(
paramA, paramB, paramC);
void functionDecl(
int A, int B, int C)
```
After:
```
functionCall(paramA, paramB,
paramC);
void functionDecl(int A, int B,
int C)
```
Reviewed By: MyDeveloperDay
Differential Revision: https://reviews.llvm.org/D90246
Added:
Modified:
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 22dcd7521dbe..0fdcca867e3d 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -2734,7 +2734,11 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
if (Left.is(TT_TemplateOpener))
return 100;
if (Left.opensScope()) {
- if (Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign)
+ // If we aren't aligning after opening parens/braces we can always break
+ // here unless the style does not want us to place all arguments on the
+ // next line.
+ if (Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign &&
+ (Left.ParameterCount <= 1 || Style.AllowAllArgumentsOnNextLine))
return 0;
if (Left.is(tok::l_brace) && !Style.Cpp11BracedListStyle)
return 19;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 0c08eb55be5f..3d4e3e445c78 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -4992,6 +4992,60 @@ TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
Style);
}
+TEST_F(FormatTest, AllowAllArgumentsOnNextLineDontAlign) {
+ // Check that AllowAllArgumentsOnNextLine is respected for both BAS_DontAlign
+ // and BAS_Align.
+ auto Style = getLLVMStyle();
+ Style.ColumnLimit = 35;
+ StringRef Input = "functionCall(paramA, paramB, paramC);\n"
+ "void functionDecl(int A, int B, int C);";
+ Style.AllowAllArgumentsOnNextLine = false;
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
+ EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n"
+ " paramC);\n"
+ "void functionDecl(int A, int B,\n"
+ " int C);"),
+ format(Input, Style));
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
+ EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n"
+ " paramC);\n"
+ "void functionDecl(int A, int B,\n"
+ " int C);"),
+ format(Input, Style));
+ // However, BAS_AlwaysBreak should take precedence over
+ // AllowAllArgumentsOnNextLine.
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
+ EXPECT_EQ(StringRef("functionCall(\n"
+ " paramA, paramB, paramC);\n"
+ "void functionDecl(\n"
+ " int A, int B, int C);"),
+ format(Input, Style));
+
+ // When AllowAllArgumentsOnNextLine is set, we prefer breaking before the
+ // first argument.
+ Style.AllowAllArgumentsOnNextLine = true;
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
+ EXPECT_EQ(StringRef("functionCall(\n"
+ " paramA, paramB, paramC);\n"
+ "void functionDecl(\n"
+ " int A, int B, int C);"),
+ format(Input, Style));
+ // It wouldn't fit on one line with aligned parameters so this setting
+ // doesn't change anything for BAS_Align.
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
+ EXPECT_EQ(StringRef("functionCall(paramA, paramB,\n"
+ " paramC);\n"
+ "void functionDecl(int A, int B,\n"
+ " int C);"),
+ format(Input, Style));
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
+ EXPECT_EQ(StringRef("functionCall(\n"
+ " paramA, paramB, paramC);\n"
+ "void functionDecl(\n"
+ " int A, int B, int C);"),
+ format(Input, Style));
+}
+
TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
FormatStyle Style = getLLVMStyle();
Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
More information about the cfe-commits
mailing list