[clang] c24cdd5 - [clang-format] PackConstructorInitializers support PCIS_OnlyNextLine
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 6 04:05:45 PST 2023
Author: Backl1ght
Date: 2023-02-06T19:39:05+08:00
New Revision: c24cdd58a1445e9741d89137f18f1ec9c89ecead
URL: https://github.com/llvm/llvm-project/commit/c24cdd58a1445e9741d89137f18f1ec9c89ecead
DIFF: https://github.com/llvm/llvm-project/commit/c24cdd58a1445e9741d89137f18f1ec9c89ecead.diff
LOG: [clang-format] PackConstructorInitializers support PCIS_OnlyNextLine
fixes https://github.com/llvm/llvm-project/issues/60241
Differential Revision: https://reviews.llvm.org/D143091
Added:
Modified:
clang/docs/ClangFormatStyleOptions.rst
clang/docs/ReleaseNotes.rst
clang/include/clang/Format/Format.h
clang/lib/Format/ContinuationIndenter.cpp
clang/lib/Format/Format.cpp
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/ConfigParseTest.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst
index ea4fe179eddce..fd8f2bbb54322 100644
--- a/clang/docs/ClangFormatStyleOptions.rst
+++ b/clang/docs/ClangFormatStyleOptions.rst
@@ -3888,6 +3888,23 @@ the configuration (without a prefix: ``Auto``).
bbbbbbbbbbbbbbbbbbbb(),
cccccccccccccccccccc()
+ * ``PCIS_NextLineOnly`` (in configuration: ``NextLineOnly``)
+ Put all constructor initializers on the next line if they fit.
+ Otherwise, put each one on its own line.
+
+ .. code-block:: c++
+
+ Constructor()
+ : a(), b()
+
+ Constructor()
+ : aaaaaaaaaaaaaaaaaaaa(), bbbbbbbbbbbbbbbbbbbb(), ddddddddddddd()
+
+ Constructor()
+ : aaaaaaaaaaaaaaaaaaaa(),
+ bbbbbbbbbbbbbbbbbbbb(),
+ cccccccccccccccccccc()
+
.. _PenaltyBreakAssignment:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 4463f03174543..50c647a4faaf7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -197,6 +197,11 @@ AST Matchers
clang-format
------------
+- Add ``NextLineOnly`` style to option ``PackConstructorInitializers``.
+ Compared to ``NextLine`` style, ``NextLineOnly`` style will not try to
+ put the initializers on the current line first, instead, it will try to
+ put the initializers on the next line only.
+
clang-extdef-mapping
--------------------
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index b5f9b8b955a76..0d57d7996525a 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -2929,6 +2929,21 @@ struct FormatStyle {
/// cccccccccccccccccccc()
/// \endcode
PCIS_NextLine,
+ /// Put all constructor initializers on the next line if they fit.
+ /// Otherwise, put each one on its own line.
+ /// \code
+ /// Constructor()
+ /// : a(), b()
+ ///
+ /// Constructor()
+ /// : aaaaaaaaaaaaaaaaaaaa(), bbbbbbbbbbbbbbbbbbbb(), ddddddddddddd()
+ ///
+ /// Constructor()
+ /// : aaaaaaaaaaaaaaaaaaaa(),
+ /// bbbbbbbbbbbbbbbbbbbb(),
+ /// cccccccccccccccccccc()
+ /// \endcode
+ PCIS_NextLineOnly,
};
/// The pack constructor initializers style to use.
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 412c57b850b51..d82ea43c1c34f 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -1053,13 +1053,16 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
bool PreviousIsBreakingCtorInitializerColon =
PreviousNonComment && PreviousNonComment->is(TT_CtorInitializerColon) &&
Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon;
+ bool AllowAllConstructorInitializersOnNextLine =
+ Style.PackConstructorInitializers == FormatStyle::PCIS_NextLine ||
+ Style.PackConstructorInitializers == FormatStyle::PCIS_NextLineOnly;
if (!(Previous.isOneOf(tok::l_paren, tok::l_brace, TT_BinaryOperator) ||
PreviousIsBreakingCtorInitializerColon) ||
(!Style.AllowAllParametersOfDeclarationOnNextLine &&
State.Line->MustBeDeclaration) ||
(!Style.AllowAllArgumentsOnNextLine &&
!State.Line->MustBeDeclaration) ||
- (Style.PackConstructorInitializers != FormatStyle::PCIS_NextLine &&
+ (!AllowAllConstructorInitializersOnNextLine &&
PreviousIsBreakingCtorInitializerColon) ||
Previous.is(TT_DictLiteral)) {
CurrentState.BreakBeforeParameter = true;
@@ -1069,7 +1072,7 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
// and we allow all arguments on the next line, we should not break
// before the next parameter.
if (PreviousIsBreakingCtorInitializerColon &&
- Style.PackConstructorInitializers == FormatStyle::PCIS_NextLine) {
+ AllowAllConstructorInitializersOnNextLine) {
CurrentState.BreakBeforeParameter = false;
}
}
@@ -1401,7 +1404,8 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
if (Style.PackConstructorInitializers > FormatStyle::PCIS_BinPack) {
CurrentState.AvoidBinPacking = true;
CurrentState.BreakBeforeParameter =
- Style.PackConstructorInitializers != FormatStyle::PCIS_NextLine;
+ Style.PackConstructorInitializers != FormatStyle::PCIS_NextLine &&
+ Style.PackConstructorInitializers != FormatStyle::PCIS_NextLineOnly;
} else {
CurrentState.BreakBeforeParameter = false;
}
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index ea20757625755..d1c626fd7e019 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -443,6 +443,7 @@ struct ScalarEnumerationTraits<FormatStyle::PackConstructorInitializersStyle> {
IO.enumCase(Value, "BinPack", FormatStyle::PCIS_BinPack);
IO.enumCase(Value, "CurrentLine", FormatStyle::PCIS_CurrentLine);
IO.enumCase(Value, "NextLine", FormatStyle::PCIS_NextLine);
+ IO.enumCase(Value, "NextLineOnly", FormatStyle::PCIS_NextLineOnly);
}
};
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 40e1951872243..2186d68ab430b 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -4634,6 +4634,18 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
Right.isOneOf(TT_CtorInitializerComma, TT_CtorInitializerColon)) {
return true;
}
+ if (Style.PackConstructorInitializers == FormatStyle::PCIS_NextLineOnly) {
+ if ((Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeColon ||
+ Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) &&
+ Right.is(TT_CtorInitializerColon)) {
+ return true;
+ }
+
+ if (Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon &&
+ Left.is(TT_CtorInitializerColon)) {
+ return true;
+ }
+ }
// Break only if we have multiple inheritance.
if (Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma &&
Right.is(TT_InheritanceComma)) {
diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp
index f432c2641b244..1ebd48717fff8 100644
--- a/clang/unittests/Format/ConfigParseTest.cpp
+++ b/clang/unittests/Format/ConfigParseTest.cpp
@@ -400,6 +400,8 @@ TEST(ConfigParseTest, ParsesConfiguration) {
PackConstructorInitializers, FormatStyle::PCIS_CurrentLine);
CHECK_PARSE("PackConstructorInitializers: NextLine",
PackConstructorInitializers, FormatStyle::PCIS_NextLine);
+ CHECK_PARSE("PackConstructorInitializers: NextLineOnly",
+ PackConstructorInitializers, FormatStyle::PCIS_NextLineOnly);
// For backward compatibility:
CHECK_PARSE("BasedOnStyle: Google\n"
"ConstructorInitializerAllOnOneLineOrOnePerLine: true\n"
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index df8ce0187010f..b00c597b69a1d 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -7289,6 +7289,19 @@ TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
Style);
verifyFormat("Constructor() : a(a), b(b) {}", Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("Constructor()\n"
+ " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
+ Style);
+ verifyFormat("Constructor()\n"
+ " : a(a), b(b) {}",
+ Style);
+ verifyFormat("Constructor()\n"
+ " : aaaaaaaaaaaaaaaaaaaa(a)\n"
+ " , bbbbbbbbbbbbbbbbbbbbb(b)\n"
+ " , cccccccccccccccccccccc(c) {}",
+ Style);
+
Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
Style.PackConstructorInitializers = FormatStyle::PCIS_NextLine;
verifyFormat("Constructor()\n"
@@ -7301,6 +7314,19 @@ TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
" bbbbbbbbbbbbbbbbbbbbb(b) {}",
Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("Constructor()\n"
+ " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
+ Style);
+ verifyFormat("Constructor()\n"
+ " : a(a), b(b) {}",
+ Style);
+ verifyFormat("Constructor()\n"
+ " : aaaaaaaaaaaaaaaaaaaa(a),\n"
+ " bbbbbbbbbbbbbbbbbbbbb(b),\n"
+ " cccccccccccccccccccccc(c) {}",
+ Style);
+
Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
Style.PackConstructorInitializers = FormatStyle::PCIS_NextLine;
verifyFormat("Constructor() :\n"
@@ -7312,6 +7338,19 @@ TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
" aaaaaaaaaaaaaaaaaa(a),\n"
" bbbbbbbbbbbbbbbbbbbbb(b) {}",
Style);
+
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("Constructor() :\n"
+ " aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
+ Style);
+ verifyFormat("Constructor() :\n"
+ " a(a), b(b) {}",
+ Style);
+ verifyFormat("Constructor() :\n"
+ " aaaaaaaaaaaaaaaaaaaa(a),\n"
+ " bbbbbbbbbbbbbbbbbbbbb(b),\n"
+ " cccccccccccccccccccccc(c) {}",
+ Style);
}
// Test interactions between AllowAllParametersOfDeclarationOnNextLine and
@@ -7319,6 +7358,7 @@ TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
// BreakConstructorInitializers modes
Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Style.AllowAllParametersOfDeclarationOnNextLine = true;
+ Style.PackConstructorInitializers = FormatStyle::PCIS_CurrentLine;
verifyFormat("SomeClassWithALongName::Constructor(\n"
" int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
" : aaaaaaaaaaaaaaaaaaaa(a)\n"
@@ -7333,6 +7373,14 @@ TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
" : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("SomeClassWithALongName::Constructor(\n"
+ " int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
+ " int bbbbbbbbbbbbb,\n"
+ " int cccccccccccccccc)\n"
+ " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
+ Style);
+
Style.AllowAllParametersOfDeclarationOnNextLine = false;
Style.PackConstructorInitializers = FormatStyle::PCIS_CurrentLine;
verifyFormat("SomeClassWithALongName::Constructor(\n"
@@ -7359,6 +7407,14 @@ TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
" : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("SomeClassWithALongName::Constructor(\n"
+ " int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
+ " int bbbbbbbbbbbbb,\n"
+ " int cccccccccccccccc)\n"
+ " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
+ Style);
+
Style.AllowAllParametersOfDeclarationOnNextLine = false;
Style.PackConstructorInitializers = FormatStyle::PCIS_CurrentLine;
verifyFormat("SomeClassWithALongName::Constructor(\n"
@@ -7384,6 +7440,14 @@ TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
" aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("SomeClassWithALongName::Constructor(\n"
+ " int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
+ " int bbbbbbbbbbbbb,\n"
+ " int cccccccccccccccc) :\n"
+ " aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
+ Style);
+
Style.AllowAllParametersOfDeclarationOnNextLine = false;
Style.PackConstructorInitializers = FormatStyle::PCIS_CurrentLine;
verifyFormat("SomeClassWithALongName::Constructor(\n"
@@ -7587,6 +7651,16 @@ TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
" aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat(
+ "SomeClass::Constructor() :\n"
+ " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
+ Style);
+ verifyFormat(
+ "SomeClass::Constructor() : // NOLINT\n"
+ " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
+ Style);
+
Style.PackConstructorInitializers = FormatStyle::PCIS_BinPack;
verifyFormat(
"SomeClass::Constructor() :\n"
@@ -7845,6 +7919,8 @@ TEST_F(FormatTest, MemoizationTests) {
input += " a,\n";
input += " a) {}";
verifyFormat(input, OnePerLine);
+ OnePerLine.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat(input, OnePerLine);
}
#endif
@@ -20891,6 +20967,19 @@ TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
"SomeClass::Constructor()\n"
" : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("SomeClass::Constructor()\n"
+ " : aaaaaaaa(aaaaaaaa) {}",
+ Style);
+ verifyFormat("SomeClass::Constructor()\n"
+ " : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
+ Style);
+ verifyFormat(
+ "SomeClass::Constructor()\n"
+ " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
+ Style);
+
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLine;
Style.ConstructorInitializerIndentWidth = 4;
Style.ColumnLimit = 60;
verifyFormat("SomeClass::Constructor()\n"
@@ -20898,6 +20987,12 @@ TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
" , aaaaaaaa(aaaaaaaa)\n"
" , aaaaaaaa(aaaaaaaa) {}",
Style);
+ Style.PackConstructorInitializers = FormatStyle::PCIS_NextLineOnly;
+ verifyFormat("SomeClass::Constructor()\n"
+ " : aaaaaaaa(aaaaaaaa)\n"
+ " , aaaaaaaa(aaaaaaaa)\n"
+ " , aaaaaaaa(aaaaaaaa) {}",
+ Style);
}
TEST_F(FormatTest, ConstructorInitializersWithPreprocessorDirective) {
More information about the cfe-commits
mailing list