https://github.com/gedare updated https://github.com/llvm/llvm-project/pull/108332
>From 64000ad7d2310ac916b37ed808997bfcb6b9f324 Mon Sep 17 00:00:00 2001 From: Gedare Bloom <ged...@rtems.org> Date: Thu, 20 Jun 2024 17:35:39 -0600 Subject: [PATCH 1/4] Format: add AlignAfterControlStatement Introduce new style option to allow overriding the breaking after the opening parenthesis for control statements (if/for/while/switch). Fixes #67738. Fixes #79176. Fixes #80123. --- clang/include/clang/Format/Format.h | 17 ++ clang/lib/Format/ContinuationIndenter.cpp | 70 +++-- clang/lib/Format/Format.cpp | 11 + clang/lib/Format/TokenAnnotator.cpp | 7 +- clang/unittests/Format/ConfigParseTest.cpp | 8 + clang/unittests/Format/FormatTest.cpp | 299 +++++++++++++++++++++ 6 files changed, 390 insertions(+), 22 deletions(-) diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index f6ceef08b46da..274a9e4ee272a 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -62,6 +62,22 @@ struct FormatStyle { /// \version 3.3 int AccessModifierOffset; + /// Different styles for breaking the parenthesis after a control statement + /// (``if/switch/while/for ...``). + /// \version 21 + enum BreakAfterControlStatementStyle : int8_t { + /// Use the default behavior. + BACSS_Default, + /// Force break after the left parenthesis of a control statement only + /// when the expression exceeds the column limit, and align on the + /// ``ContinuationIndentWidth``. + BACSS_MultiLine, + /// Do not force a break after the control statment. + BACSS_No, + }; + + BreakAfterControlStatementStyle AlignAfterControlStatement; + /// Different styles for aligning after open brackets. enum BracketAlignmentStyle : int8_t { /// Align parameters on the open bracket, e.g.: @@ -5283,6 +5299,7 @@ struct FormatStyle { bool operator==(const FormatStyle &R) const { return AccessModifierOffset == R.AccessModifierOffset && AlignAfterOpenBracket == R.AlignAfterOpenBracket && + AlignAfterControlStatement == R.AlignAfterControlStatement && AlignArrayOfStructures == R.AlignArrayOfStructures && AlignConsecutiveAssignments == R.AlignConsecutiveAssignments && AlignConsecutiveBitFields == R.AlignConsecutiveBitFields && diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 55e1d1ceb55b7..08558d6550832 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -814,6 +814,11 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun, // parenthesis by disallowing any further line breaks if there is no line // break after the opening parenthesis. Don't break if it doesn't conserve // columns. + auto IsOtherConditional = [&](const FormatToken &Tok) { + return Tok.isOneOf(tok::kw_for, tok::kw_while, tok::kw_switch) || + (Style.isJavaScript() && Tok.is(Keywords.kw_await) && Tok.Previous && + Tok.Previous->is(tok::kw_for)); + }; auto IsOpeningBracket = [&](const FormatToken &Tok) { auto IsStartOfBracedList = [&]() { return Tok.is(tok::l_brace) && Tok.isNot(BK_Block) && @@ -825,26 +830,37 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun, } if (!Tok.Previous) return true; - if (Tok.Previous->isIf()) - return Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak; - return !Tok.Previous->isOneOf(TT_CastRParen, tok::kw_for, tok::kw_while, - tok::kw_switch) && - !(Style.isJavaScript() && Tok.Previous->is(Keywords.kw_await)); + if (Tok.Previous->isIf()) { + /* For backward compatibility, use AlignAfterOpenBracket + * in case AlignAfterControlStatement is not initialized */ + return Style.AlignAfterControlStatement == FormatStyle::BACSS_MultiLine || + (Style.AlignAfterControlStatement == FormatStyle::BACSS_Default && + Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak); + } + if (IsOtherConditional(*Tok.Previous)) { + return Style.AlignAfterControlStatement == FormatStyle::BACSS_MultiLine; + } + if (Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak || + Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) { + return !Tok.Previous->is(TT_CastRParen) && + !(Style.isJavaScript() && Tok.is(Keywords.kw_await)); + } + return false; }; auto IsFunctionCallParen = [](const FormatToken &Tok) { return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous && Tok.Previous->is(tok::identifier); }; - auto IsInTemplateString = [this](const FormatToken &Tok) { + auto IsInTemplateString = [this](const FormatToken &Tok, bool NestBlocks) { if (!Style.isJavaScript()) return false; for (const auto *Prev = &Tok; Prev; Prev = Prev->Previous) { if (Prev->is(TT_TemplateString) && Prev->opensScope()) return true; - if (Prev->opensScope() || - (Prev->is(TT_TemplateString) && Prev->closesScope())) { - break; - } + if (Prev->opensScope() && !NestBlocks) + return false; + if (Prev->is(TT_TemplateString) && Prev->closesScope()) + return false; } return false; }; @@ -866,21 +882,24 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun, Tok.isOneOf(tok::ellipsis, Keywords.kw_await))) { return true; } - const auto *Previous = Tok.Previous; - if (!Previous || (!Previous->isOneOf(TT_FunctionDeclarationLParen, - TT_LambdaDefinitionLParen) && - !IsFunctionCallParen(*Previous))) { + const auto *Previous = TokAfterLParen.Previous; + assert(Previous); // IsOpeningBracket(Previous) + if (Previous->Previous && (Previous->Previous->isIf() || + IsOtherConditional(*Previous->Previous))) { + return false; + } + if (!Previous->isOneOf(TT_FunctionDeclarationLParen, + TT_LambdaDefinitionLParen) && + !IsFunctionCallParen(*Previous)) { return true; } - if (IsOpeningBracket(Tok) || IsInTemplateString(Tok)) + if (IsOpeningBracket(Tok) || IsInTemplateString(Tok, true)) return true; const auto *Next = Tok.Next; return !Next || Next->isMemberAccess() || Next->is(TT_FunctionDeclarationLParen) || IsFunctionCallParen(*Next); }; - if ((Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak || - Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) && - IsOpeningBracket(Previous) && State.Column > getNewLineColumn(State) && + if (IsOpeningBracket(Previous) && State.Column > getNewLineColumn(State) && // Don't do this for simple (no expressions) one-argument function calls // as that feels like needlessly wasting whitespace, e.g.: // @@ -910,7 +929,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun, !(Current.MacroParent && Previous.MacroParent) && (Current.isNot(TT_LineComment) || Previous.isOneOf(BK_BracedInit, TT_VerilogMultiLineListLParen)) && - !IsInTemplateString(Current)) { + !IsInTemplateString(Current, false)) { CurrentState.Indent = State.Column + Spaces; CurrentState.IsAligned = true; } @@ -1247,8 +1266,17 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State, } if (PreviousNonComment && PreviousNonComment->is(tok::l_paren)) { - CurrentState.BreakBeforeClosingParen = - Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent; + auto Previous = PreviousNonComment->Previous; + if (Previous && + (Previous->isIf() || + Previous->isOneOf(tok::kw_for, tok::kw_while, tok::kw_switch))) { + CurrentState.BreakBeforeClosingParen = + Style.AlignAfterControlStatement == FormatStyle::BACSS_MultiLine && + Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent; + } else { + CurrentState.BreakBeforeClosingParen = + Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent; + } } if (PreviousNonComment && PreviousNonComment->is(TT_TemplateOpener)) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 5a1c3f556b331..e6a82a093bf20 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -202,6 +202,14 @@ template <> struct MappingTraits<FormatStyle::BraceWrappingFlags> { } }; +template <> struct ScalarEnumerationTraits<FormatStyle::BreakAfterControlStatementStyle> { + static void enumeration(IO &IO, FormatStyle::BreakAfterControlStatementStyle &Value) { + IO.enumCase(Value, "Default", FormatStyle::BACSS_Default); + IO.enumCase(Value, "MultiLine", FormatStyle::BACSS_MultiLine); + IO.enumCase(Value, "No", FormatStyle::BACSS_No); + } +}; + template <> struct ScalarEnumerationTraits<FormatStyle::BracketAlignmentStyle> { static void enumeration(IO &IO, FormatStyle::BracketAlignmentStyle &Value) { IO.enumCase(Value, "Align", FormatStyle::BAS_Align); @@ -954,6 +962,8 @@ template <> struct MappingTraits<FormatStyle> { IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset); IO.mapOptional("AlignAfterOpenBracket", Style.AlignAfterOpenBracket); + IO.mapOptional("AlignAfterControlStatement", + Style.AlignAfterControlStatement); IO.mapOptional("AlignArrayOfStructures", Style.AlignArrayOfStructures); IO.mapOptional("AlignConsecutiveAssignments", Style.AlignConsecutiveAssignments); @@ -1485,6 +1495,7 @@ static void expandPresetsSpacesInParens(FormatStyle &Expanded) { FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) { FormatStyle LLVMStyle; LLVMStyle.AccessModifierOffset = -2; + LLVMStyle.AlignAfterControlStatement = FormatStyle::BACSS_Default; LLVMStyle.AlignAfterOpenBracket = FormatStyle::BAS_Align; LLVMStyle.AlignArrayOfStructures = FormatStyle::AIAS_None; LLVMStyle.AlignConsecutiveAssignments = {}; diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index e56cc92987af7..39ddb63d48d91 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -6219,7 +6219,12 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, if (Next && Next->is(tok::l_paren)) return false; const FormatToken *Previous = Right.MatchingParen->Previous; - return !(Previous && (Previous->is(tok::kw_for) || Previous->isIf())); + if (!Previous) + return true; + if (Previous->isIf() || Previous->isOneOf(tok::kw_for, tok::kw_while, tok::kw_switch)) { + return Style.AlignAfterControlStatement == FormatStyle::BACSS_MultiLine; + } + return true; } if (Left.isOneOf(tok::r_paren, TT_TrailingAnnotation) && diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp index 2b08b794792e9..debdb08da4b80 100644 --- a/clang/unittests/Format/ConfigParseTest.cpp +++ b/clang/unittests/Format/ConfigParseTest.cpp @@ -528,6 +528,14 @@ TEST(ConfigParseTest, ParsesConfiguration) { CHECK_PARSE("EnumTrailingComma: Remove", EnumTrailingComma, FormatStyle::ETC_Remove); + Style.AlignAfterControlStatement = FormatStyle::BACSS_Default; + CHECK_PARSE("AlignAfterControlStatement: MultiLine", + AlignAfterControlStatement, FormatStyle::BACSS_MultiLine); + CHECK_PARSE("AlignAfterControlStatement: No", AlignAfterControlStatement, + FormatStyle::BACSS_No); + CHECK_PARSE("AlignAfterControlStatement: Default", AlignAfterControlStatement, + FormatStyle::BACSS_Default); + Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, FormatStyle::BAS_Align); diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 333d40d481025..7841caefd597b 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -9694,6 +9694,305 @@ TEST_F(FormatTest, ParenthesesAndOperandAlignment) { Style); } +TEST_F(FormatTest, AlignAfterConditionalStatements) { + FormatStyle Style = getLLVMStyle(); + + Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; + Style.AlignAfterControlStatement = FormatStyle::BACSS_MultiLine; + + verifyFormat("void foo() {\n" + " if constexpr (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "bbb) == 0) {\n" + " return;\n" + " } else if (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "bbb) == 0) {\n" + " return;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " switch (\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n" + " default:\n" + " break;\n" + " }\n" + "}", + Style); + + verifyFormat( + "void foo() {\n" + " for (\n" + " aaaaaaaaaaaaaaaaaaaaaa = 0;\n" + " (aaaaaaaaaaaaaaaaaaaaaa->bbbbbbbbbbbbbb |\n" + " aaaaaaaaaaaaaaaaaaaaaa->ccccccccccccccccccccccc) == 0;\n" + " aaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaa->next) {\n" + " ;\n" + " }\n" + "}", + Style); + + verifyFormat( + "void foo() {\n" + " while (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0) " + "{\n" + " continue;\n" + " }\n" + "}", + Style); + + Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; + Style.AlignAfterControlStatement = FormatStyle::BACSS_MultiLine; + + verifyFormat("void foo() {\n" + " if constexpr (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + ") == 0) {\n" + " return;\n" + " } else if (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + ") == 0) {\n" + " return;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " switch (\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n" + " default:\n" + " break;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " for (\n" + " aaaaaaaaaaaaaaaaaaaaaa = 0;\n" + " (aaaaaaaaaaaaaaaaaaaaaa->bbbbbbbbbbbbbb |\n" + " aaaaaaaaaaaaaaaaaaaaaa->ccccccccccccccccccccccc) == 0;\n" + " aaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaa->next) {\n" + " ;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " while (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0) " + "{\n" + " continue;\n" + " }\n" + "}", + Style); + + + Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; + Style.AlignAfterControlStatement = FormatStyle::BACSS_MultiLine; + + verifyFormat("void foo() {\n" + " if constexpr (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + ") == 0) {\n" + " return;\n" + " } else if (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + ") == 0) {\n" + " return;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " switch (\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n" + " default:\n" + " break;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " for (\n" + " aaaaaaaaaaaaaaaaaaaaaa = 0;\n" + " (aaaaaaaaaaaaaaaaaaaaaa->bbbbbbbbbbbbbb |\n" + " aaaaaaaaaaaaaaaaaaaaaa->ccccccccccccccccccccccc) == 0;\n" + " aaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaa->next) {\n" + " ;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " while (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0) " + "{\n" + " continue;\n" + " }\n" + "}", + Style); + + Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; + Style.AlignAfterControlStatement = FormatStyle::BACSS_No; + + verifyFormat("void foo() {\n" + " if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "bbbbbbbbbb) ==\n" + " 0) {\n" + " return;\n" + " } else if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "bbbbbbb) == 0) {\n" + " return;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " switch (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n" + " default:\n" + " break;\n" + " }\n" + "}", + Style); + + verifyFormat( + "void foo() {\n" + " for (aaaaaaaaaaaaaaaaaaaaaa = 0;\n" + " (aaaaaaaaaaaaaaaaaaaaaa->bbbbbbbbbbbbbb |\n" + " aaaaaaaaaaaaaaaaaaaaaa->ccccccccccccccccccccccc) == 0;\n" + " aaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaa->next) {\n" + " ;\n" + " }\n" + "}", + Style); + + verifyFormat( + "void foo() {\n" + " while ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0) " + "{\n" + " continue;\n" + " }\n" + "}", + Style); + + Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; + Style.AlignAfterControlStatement = FormatStyle::BACSS_MultiLine; + + verifyFormat( + "void foo() {\n" + " if constexpr (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0\n" + " ) {\n" + " return;\n" + " } else if (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0\n" + " ) {\n" + " return;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " switch (\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | " + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " ) {\n" + " default:\n" + " break;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " for (\n" + " aaaaaaaaaaaaaaaaaaaaaa = 0;\n" + " (aaaaaaaaaaaaaaaaaaaaaa->bbbbbbbbbbbbbb |\n" + " aaaaaaaaaaaaaaaaaaaaaa->ccccccccccccccccccccccc) == 0;\n" + " aaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaa->next\n" + " ) {\n" + " ;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " while (\n" + " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0\n" + " ) {\n" + " continue;\n" + " }\n" + "}", + Style); + + Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; + Style.AlignAfterControlStatement = FormatStyle::BACSS_No; + + verifyFormat("void foo() {\n" + " if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "bbbbbbbbbb) ==\n" + " 0) {\n" + " return;\n" + " } else if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "bbbbbbb) == 0) {\n" + " return;\n" + " }\n" + "}", + Style); + + verifyFormat("void foo() {\n" + " switch (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n" + " default:\n" + " break;\n" + " }\n" + "}", + Style); + + verifyFormat( + "void foo() {\n" + " for (aaaaaaaaaaaaaaaaaaaaaa = 0;\n" + " (aaaaaaaaaaaaaaaaaaaaaa->bbbbbbbbbbbbbb |\n" + " aaaaaaaaaaaaaaaaaaaaaa->ccccccccccccccccccccccc) == 0;\n" + " aaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaa->next) {\n" + " ;\n" + " }\n" + "}", + Style); + + verifyFormat( + "void foo() {\n" + " while ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |\n" + " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) == 0) {\n" + " continue;\n" + " }\n" + "}", + Style); +} + TEST_F(FormatTest, BreaksConditionalExpressions) { verifyFormat( "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" >From a6ea4d3867a4c232c7ba98ef3de9fce6d1875c3d Mon Sep 17 00:00:00 2001 From: Gedare Bloom <ged...@rtems.org> Date: Wed, 11 Sep 2024 22:48:12 -0600 Subject: [PATCH 2/4] Update release notes --- clang/docs/ReleaseNotes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3105d8b481560..1a4d5de86f2f7 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -695,6 +695,7 @@ clang-format top of the file. - Add ``EnumTrailingComma`` option for inserting/removing commas at the end of ``enum`` enumerator lists. +- Adds ``AlignAfterControl Statement`` option. libclang -------- >From 75da86c9eee75288e6e16b220e10998039c97feb Mon Sep 17 00:00:00 2001 From: Gedare Bloom <ged...@rtems.org> Date: Tue, 29 Apr 2025 17:24:26 -0600 Subject: [PATCH 3/4] fix release notes --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 1a4d5de86f2f7..bf1b103674b33 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -695,7 +695,7 @@ clang-format top of the file. - Add ``EnumTrailingComma`` option for inserting/removing commas at the end of ``enum`` enumerator lists. -- Adds ``AlignAfterControl Statement`` option. +- Adds ``AlignAfterControlStatement`` option. libclang -------- >From 2fc7ea96907e97a36970c7e632132ee272dea7ec Mon Sep 17 00:00:00 2001 From: Gedare Bloom <ged...@rtems.org> Date: Tue, 29 Apr 2025 17:28:19 -0600 Subject: [PATCH 4/4] fix formatting --- clang/lib/Format/ContinuationIndenter.cpp | 11 +++++------ clang/lib/Format/Format.cpp | 6 ++++-- clang/lib/Format/TokenAnnotator.cpp | 3 ++- clang/unittests/Format/FormatTest.cpp | 1 - 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 08558d6550832..f4e48b7e37d54 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -834,16 +834,15 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun, /* For backward compatibility, use AlignAfterOpenBracket * in case AlignAfterControlStatement is not initialized */ return Style.AlignAfterControlStatement == FormatStyle::BACSS_MultiLine || - (Style.AlignAfterControlStatement == FormatStyle::BACSS_Default && - Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak); + (Style.AlignAfterControlStatement == FormatStyle::BACSS_Default && + Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak); } - if (IsOtherConditional(*Tok.Previous)) { + if (IsOtherConditional(*Tok.Previous)) return Style.AlignAfterControlStatement == FormatStyle::BACSS_MultiLine; - } if (Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak || - Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) { + Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) { return !Tok.Previous->is(TT_CastRParen) && - !(Style.isJavaScript() && Tok.is(Keywords.kw_await)); + !(Style.isJavaScript() && Tok.is(Keywords.kw_await)); } return false; }; diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index e6a82a093bf20..cd7e4cb06cc04 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -202,8 +202,10 @@ template <> struct MappingTraits<FormatStyle::BraceWrappingFlags> { } }; -template <> struct ScalarEnumerationTraits<FormatStyle::BreakAfterControlStatementStyle> { - static void enumeration(IO &IO, FormatStyle::BreakAfterControlStatementStyle &Value) { +template <> +struct ScalarEnumerationTraits<FormatStyle::BreakAfterControlStatementStyle> { + static void enumeration(IO &IO, + FormatStyle::BreakAfterControlStatementStyle &Value) { IO.enumCase(Value, "Default", FormatStyle::BACSS_Default); IO.enumCase(Value, "MultiLine", FormatStyle::BACSS_MultiLine); IO.enumCase(Value, "No", FormatStyle::BACSS_No); diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 39ddb63d48d91..881d40abf6748 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -6221,7 +6221,8 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, const FormatToken *Previous = Right.MatchingParen->Previous; if (!Previous) return true; - if (Previous->isIf() || Previous->isOneOf(tok::kw_for, tok::kw_while, tok::kw_switch)) { + if (Previous->isIf() || + Previous->isOneOf(tok::kw_for, tok::kw_while, tok::kw_switch)) { return Style.AlignAfterControlStatement == FormatStyle::BACSS_MultiLine; } return true; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 7841caefd597b..a314a0bffc106 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -9797,7 +9797,6 @@ TEST_F(FormatTest, AlignAfterConditionalStatements) { "}", Style); - Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; Style.AlignAfterControlStatement = FormatStyle::BACSS_MultiLine; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits