Skip to content

Commit 0d0868d

Browse files
committed
[clang-format] Add BreakFunctionDefinitionParameters option
1 parent 2867095 commit 0d0868d

File tree

6 files changed

+44
-0
lines changed

6 files changed

+44
-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
@@ -933,6 +933,8 @@ template <> struct MappingTraits<FormatStyle> {
933933
IO.mapOptional("BreakAfterJavaFieldAnnotations",
934934
Style.BreakAfterJavaFieldAnnotations);
935935
IO.mapOptional("BreakAfterReturnType", Style.BreakAfterReturnType);
936+
IO.mapOptional("BreakFunctionDefinitionParameters",
937+
Style.BreakFunctionDefinitionParameters);
936938
IO.mapOptional("BreakArrays", Style.BreakArrays);
937939
IO.mapOptional("BreakBeforeBinaryOperators",
938940
Style.BreakBeforeBinaryOperators);
@@ -1443,6 +1445,7 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
14431445
LLVMStyle.BreakAfterAttributes = FormatStyle::ABS_Leave;
14441446
LLVMStyle.BreakAfterJavaFieldAnnotations = false;
14451447
LLVMStyle.BreakAfterReturnType = FormatStyle::RTBS_None;
1448+
LLVMStyle.BreakFunctionDefinitionParameters = false;
14461449
LLVMStyle.BreakArrays = true;
14471450
LLVMStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
14481451
LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach;

clang/lib/Format/FormatToken.h

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

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

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,6 +1502,7 @@ class AnnotatingParser {
15021502
(!Previous->isAttribute() &&
15031503
!Previous->isOneOf(TT_RequiresClause, TT_LeadingJavaAnnotation))) {
15041504
Line.MightBeFunctionDecl = true;
1505+
Tok->MightBeFunctionDeclParen = true;
15051506
}
15061507
}
15071508
break;
@@ -5317,6 +5318,12 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
53175318
if (Right.NewlinesBefore > 1 && Style.MaxEmptyLinesToKeep > 0)
53185319
return true;
53195320

5321+
if (Style.BreakFunctionDefinitionParameters && Line.MightBeFunctionDecl &&
5322+
Line.mightBeFunctionDefinition() && Left.is(tok::l_paren) &&
5323+
Left.MightBeFunctionDeclParen && Left.ParameterCount > 0) {
5324+
return true;
5325+
}
5326+
53205327
if (Style.isCSharp()) {
53215328
if (Left.is(TT_FatArrow) && Right.is(tok::l_brace) &&
53225329
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)