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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits