Skip to content

Commit 62023c2

Browse files
committed
[clang-format] Add BreakFunctionDefinitionParameters option
1 parent c54e052 commit 62023c2

File tree

6 files changed

+45
-0
lines changed

6 files changed

+45
-0
lines changed

clang/docs/ClangFormatStyleOptions.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3150,6 +3150,12 @@ the configuration (without a prefix: ``Auto``).
31503150

31513151

31523152

3153+
.. _BreakFunctionDefinitionParameters:
3154+
3155+
**BreakFunctionDefinitionParameters** (``Boolean``) :versionbadge:`clang-format 19` :ref:`<BreakFunctionDefinitionParameters>`
3156+
If ``true``, clang-format will always break before function definition
3157+
parameters
3158+
31533159
.. _BreakInheritanceList:
31543160

31553161
**BreakInheritanceList** (``BreakInheritanceListStyle``) :versionbadge:`clang-format 7` :ref:`<BreakInheritanceList>`

clang/include/clang/Format/Format.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,6 +2218,11 @@ struct FormatStyle {
22182218
/// \version 3.8
22192219
bool BreakAfterJavaFieldAnnotations;
22202220

2221+
/// If ``true``, clang-format will always break before function definition
2222+
/// parameters
2223+
/// \version 19
2224+
bool BreakFunctionDefinitionParameters;
2225+
22212226
/// Allow breaking string literals when formatting.
22222227
///
22232228
/// In C, C++, and Objective-C:
@@ -4867,6 +4872,8 @@ struct FormatStyle {
48674872
BreakBeforeInlineASMColon == R.BreakBeforeInlineASMColon &&
48684873
BreakBeforeTernaryOperators == R.BreakBeforeTernaryOperators &&
48694874
BreakConstructorInitializers == R.BreakConstructorInitializers &&
4875+
BreakFunctionDefinitionParameters ==
4876+
R.BreakFunctionDefinitionParameters &&
48704877
BreakInheritanceList == R.BreakInheritanceList &&
48714878
BreakStringLiterals == R.BreakStringLiterals &&
48724879
BreakTemplateDeclarations == R.BreakTemplateDeclarations &&

clang/lib/Format/Format.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,8 @@ template <> struct MappingTraits<FormatStyle> {
961961
IO.mapOptional("BreakAfterJavaFieldAnnotations",
962962
Style.BreakAfterJavaFieldAnnotations);
963963
IO.mapOptional("BreakAfterReturnType", Style.BreakAfterReturnType);
964+
IO.mapOptional("BreakFunctionDefinitionParameters",
965+
Style.BreakFunctionDefinitionParameters);
964966
IO.mapOptional("BreakArrays", Style.BreakArrays);
965967
IO.mapOptional("BreakBeforeBinaryOperators",
966968
Style.BreakBeforeBinaryOperators);
@@ -1471,6 +1473,7 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
14711473
LLVMStyle.BreakAfterAttributes = FormatStyle::ABS_Leave;
14721474
LLVMStyle.BreakAfterJavaFieldAnnotations = false;
14731475
LLVMStyle.BreakAfterReturnType = FormatStyle::RTBS_None;
1476+
LLVMStyle.BreakFunctionDefinitionParameters = false;
14741477
LLVMStyle.BreakArrays = true;
14751478
LLVMStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
14761479
LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach;

clang/lib/Format/FormatToken.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,9 @@ struct FormatToken {
571571
/// Is optional and can be removed.
572572
bool Optional = false;
573573

574+
/// Might be function declaration open/closing paren.
575+
bool MightBeFunctionDeclParen = false;
576+
574577
/// Number of optional braces to be inserted after this token:
575578
/// -1: a single left brace
576579
/// 0: no braces

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,8 @@ class AnnotatingParser {
15011501
(!Previous->isAttribute() &&
15021502
!Previous->isOneOf(TT_RequiresClause, TT_LeadingJavaAnnotation))) {
15031503
Line.MightBeFunctionDecl = true;
1504+
Tok->MightBeFunctionDeclParen = true;
1505+
Tok->MatchingParen->MightBeFunctionDeclParen = true;
15041506
}
15051507
}
15061508
break;
@@ -5313,6 +5315,12 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
53135315
if (Right.NewlinesBefore > 1 && Style.MaxEmptyLinesToKeep > 0)
53145316
return true;
53155317

5318+
if (Style.BreakFunctionDefinitionParameters && Line.MightBeFunctionDecl &&
5319+
Line.mightBeFunctionDefinition() && Left.is(tok::l_paren) &&
5320+
Left.MightBeFunctionDeclParen && Left.ParameterCount > 0) {
5321+
return true;
5322+
}
5323+
53165324
if (Style.isCSharp()) {
53175325
if (Left.is(TT_FatArrow) && Right.is(tok::l_brace) &&
53185326
Style.BraceWrapping.AfterFunction) {

clang/unittests/Format/FormatTest.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7951,6 +7951,24 @@ TEST_F(FormatTest, AllowAllArgumentsOnNextLineDontAlign) {
79517951
Input, Style);
79527952
}
79537953

7954+
TEST_F(FormatTest, BreakFunctionDefinitionParameters) {
7955+
FormatStyle Style = getLLVMStyleWithColumns(80);
7956+
StringRef Input = "void functionDecl(paramA, paramB, paramC);\n"
7957+
"void emptyFunctionDefinition() {}\n"
7958+
"void functionDefinition(int A, int B, int C) {}";
7959+
Style.BreakFunctionDefinitionParameters = false;
7960+
verifyFormat(StringRef("void functionDecl(paramA, paramB, paramC);\n"
7961+
"void emptyFunctionDefinition() {}\n"
7962+
"void functionDefinition(int A, int B, int C) {}"),
7963+
Input, Style);
7964+
Style.BreakFunctionDefinitionParameters = true;
7965+
verifyFormat(StringRef("void functionDecl(paramA, paramB, paramC);\n"
7966+
"void emptyFunctionDefinition() {}\n"
7967+
"void functionDefinition(\n"
7968+
" int A, int B, int C) {}"),
7969+
Input, Style);
7970+
}
7971+
79547972
TEST_F(FormatTest, BreakBeforeInlineASMColon) {
79557973
FormatStyle Style = getLLVMStyle();
79567974
Style.BreakBeforeInlineASMColon = FormatStyle::BBIAS_Never;

0 commit comments

Comments
 (0)