Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cb5d076

Browse files
stativLukas Jirkovsky
andauthored
[clang-format] Add BreakFunctionDeclarationParameters option. (#196567)
Adds an option the break function declaration parameters, always putting them on the next line after the function opening parentheses. This is an equivalent of `BreakFunctionDefinitionParameters`, but for function declarations. --------- Co-authored-by: Lukas Jirkovsky <[email protected]>
1 parent 2caea40 commit cb5d076

8 files changed

Lines changed: 79 additions & 0 deletions

File tree

clang/docs/ClangFormatStyleOptions.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3858,6 +3858,21 @@ the configuration (without a prefix: ``Auto``).
38583858

38593859

38603860

3861+
.. _BreakFunctionDeclarationParameters:
3862+
3863+
**BreakFunctionDeclarationParameters** (``Boolean``) :versionbadge:`clang-format 23` :ref:`<BreakFunctionDeclarationParameters>`
3864+
If ``true``, clang-format will always break before function declaration
3865+
parameters.
3866+
3867+
.. code-block:: c++
3868+
3869+
true:
3870+
void functionDeclaration(
3871+
int A, int B);
3872+
3873+
false:
3874+
void functionDeclaration(int A, int B);
3875+
38613876
.. _BreakFunctionDefinitionParameters:
38623877

38633878
**BreakFunctionDefinitionParameters** (``Boolean``) :versionbadge:`clang-format 19` :ref:`<BreakFunctionDefinitionParameters>`

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,8 @@ clang-format
748748
- Extend ``BreakBinaryOperations`` to accept a structured configuration with
749749
per-operator break rules and minimum chain length gating via ``PerOperator``.
750750
- Add ``AllowShortRecordOnASingleLine`` option and set it to ``EmptyAndAttached`` for LLVM style.
751+
- Add ``BreakFunctionDeclarationParameters`` option to always break before function
752+
declaration parameters.
751753

752754
libclang
753755
--------

clang/include/clang/Format/Format.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2644,6 +2644,20 @@ struct FormatStyle {
26442644
/// \version 5
26452645
BreakConstructorInitializersStyle BreakConstructorInitializers;
26462646

2647+
/// If ``true``, clang-format will always break before function declaration
2648+
/// parameters.
2649+
/// \code
2650+
/// true:
2651+
/// void functionDeclaration(
2652+
/// int A, int B);
2653+
///
2654+
/// false:
2655+
/// void functionDeclaration(int A, int B);
2656+
///
2657+
/// \endcode
2658+
/// \version 23
2659+
bool BreakFunctionDeclarationParameters;
2660+
26472661
/// If ``true``, clang-format will always break before function definition
26482662
/// parameters.
26492663
/// \code
@@ -6076,6 +6090,8 @@ struct FormatStyle {
60766090
BreakBeforeTernaryOperators == R.BreakBeforeTernaryOperators &&
60776091
BreakBinaryOperations == R.BreakBinaryOperations &&
60786092
BreakConstructorInitializers == R.BreakConstructorInitializers &&
6093+
BreakFunctionDeclarationParameters ==
6094+
R.BreakFunctionDeclarationParameters &&
60796095
BreakFunctionDefinitionParameters ==
60806096
R.BreakFunctionDefinitionParameters &&
60816097
BreakInheritanceList == R.BreakInheritanceList &&

clang/lib/Format/Format.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,6 +1318,8 @@ template <> struct MappingTraits<FormatStyle> {
13181318
IO.mapOptional("BreakBinaryOperations", Style.BreakBinaryOperations);
13191319
IO.mapOptional("BreakConstructorInitializers",
13201320
Style.BreakConstructorInitializers);
1321+
IO.mapOptional("BreakFunctionDeclarationParameters",
1322+
Style.BreakFunctionDeclarationParameters);
13211323
IO.mapOptional("BreakFunctionDefinitionParameters",
13221324
Style.BreakFunctionDefinitionParameters);
13231325
IO.mapOptional("BreakInheritanceList", Style.BreakInheritanceList);
@@ -1885,6 +1887,7 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
18851887
LLVMStyle.BreakBeforeTernaryOperators = true;
18861888
LLVMStyle.BreakBinaryOperations = {FormatStyle::BBO_Never, {}};
18871889
LLVMStyle.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
1890+
LLVMStyle.BreakFunctionDeclarationParameters = false;
18881891
LLVMStyle.BreakFunctionDefinitionParameters = false;
18891892
LLVMStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
18901893
LLVMStyle.BreakStringLiterals = true;

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5758,6 +5758,12 @@ bool TokenAnnotator::mustBreakBefore(AnnotatedLine &Line,
57585758

57595759
const FormatToken &Left = *Right.Previous;
57605760

5761+
if (Style.BreakFunctionDeclarationParameters && Line.MightBeFunctionDecl &&
5762+
!Line.mightBeFunctionDefinition() && Left.MightBeFunctionDeclParen &&
5763+
Left.ParameterCount > 0) {
5764+
return true;
5765+
}
5766+
57615767
if (Style.BreakFunctionDefinitionParameters && Line.MightBeFunctionDecl &&
57625768
Line.mightBeFunctionDefinition() && Left.MightBeFunctionDeclParen &&
57635769
Left.ParameterCount > 0) {

clang/unittests/Format/AlignBracketsTest.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,15 @@ TEST_F(AlignBracketsTest, FormatsDefinitionBreakAlways) {
731731
"}",
732732
BreakAlways);
733733

734+
// Ensure BreakFunctionDeclarationParameters interacts correctly when
735+
// PackParameters.BinPack is set to BPPS_AlwaysOnePerLine.
736+
BreakAlways.BreakFunctionDeclarationParameters = true;
737+
verifyFormat("void f(\n"
738+
" int a,\n"
739+
" int b);",
740+
BreakAlways);
741+
BreakAlways.BreakFunctionDeclarationParameters = false;
742+
734743
// Ensure BreakFunctionDefinitionParameters interacts correctly when
735744
// PackParameters.BinPack is set to BPPS_AlwaysOnePerLine.
736745
BreakAlways.BreakFunctionDefinitionParameters = true;

clang/unittests/Format/ConfigParseTest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ TEST(ConfigParseTest, ParsesConfigurationBools) {
183183
CHECK_PARSE_BOOL(BreakBeforeCloseBracketSwitch);
184184
CHECK_PARSE_BOOL(BreakBeforeTemplateCloser);
185185
CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
186+
CHECK_PARSE_BOOL(BreakFunctionDeclarationParameters);
186187
CHECK_PARSE_BOOL(BreakStringLiterals);
187188
CHECK_PARSE_BOOL(CompactNamespaces);
188189
CHECK_PARSE_BOOL(DerivePointerAlignment);

clang/unittests/Format/FormatTest.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8119,6 +8119,33 @@ TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
81198119
Style);
81208120
}
81218121

8122+
TEST_F(FormatTest, BreakFunctionDeclarationParameters) {
8123+
StringRef Input = "void functionDecl(int A, int B, int C);\n"
8124+
"void emptyFunctionDecl();\n"
8125+
"void functionDefinition(int A, int B, int C) {}";
8126+
verifyFormat(Input);
8127+
8128+
FormatStyle Style = getLLVMStyle();
8129+
EXPECT_FALSE(Style.BreakFunctionDeclarationParameters);
8130+
Style.BreakFunctionDeclarationParameters = true;
8131+
verifyFormat("void functionDecl(\n"
8132+
" int A, int B, int C);\n"
8133+
"void emptyFunctionDecl();\n"
8134+
"void functionDefinition(int A, int B, int C) {}",
8135+
Input, Style);
8136+
8137+
// Test the style where all parameters are on their own lines.
8138+
Style.AllowAllParametersOfDeclarationOnNextLine = false;
8139+
Style.PackParameters.BinPack = FormatStyle::BPPS_OnePerLine;
8140+
verifyFormat("void functionDecl(\n"
8141+
" int A,\n"
8142+
" int B,\n"
8143+
" int C);\n"
8144+
"void emptyFunctionDecl();\n"
8145+
"void functionDefinition(int A, int B, int C) {}",
8146+
Input, Style);
8147+
}
8148+
81228149
TEST_F(FormatTest, BreakFunctionDefinitionParameters) {
81238150
StringRef Input = "void functionDecl(paramA, paramB, paramC);\n"
81248151
"void emptyFunctionDefinition() {}\n"

0 commit comments

Comments
 (0)