diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst --- a/clang/docs/ClangFormatStyleOptions.rst +++ b/clang/docs/ClangFormatStyleOptions.rst @@ -3194,6 +3194,9 @@ **PenaltyBreakTemplateDeclaration** (``Unsigned``) :versionbadge:`clang-format 7` The penalty for breaking after template declaration. +**PenaltyBreakOpenParenthesis** (``Unsigned``) :versionbadge:`clang-format 14` + The penalty for breaking after ``(``. + **PenaltyExcessCharacter** (``Unsigned``) :versionbadge:`clang-format 3.7` The penalty for each character outside of the column limit. diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -2887,6 +2887,10 @@ /// \version 3.7 unsigned PenaltyBreakFirstLessLess; + /// The penalty for breaking after ``(``. + /// \version 14 + unsigned PenaltyBreakOpenParenthesis; + /// The penalty for each line break introduced inside a string literal. /// \version 3.7 unsigned PenaltyBreakString; @@ -3781,6 +3785,7 @@ R.PenaltyBreakBeforeFirstCallParameter && PenaltyBreakComment == R.PenaltyBreakComment && PenaltyBreakFirstLessLess == R.PenaltyBreakFirstLessLess && + PenaltyBreakOpenParenthesis == R.PenaltyBreakOpenParenthesis && PenaltyBreakString == R.PenaltyBreakString && PenaltyExcessCharacter == R.PenaltyExcessCharacter && PenaltyReturnTypeOnItsOwnLine == R.PenaltyReturnTypeOnItsOwnLine && diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -756,6 +756,8 @@ IO.mapOptional("PenaltyBreakComment", Style.PenaltyBreakComment); IO.mapOptional("PenaltyBreakFirstLessLess", Style.PenaltyBreakFirstLessLess); + IO.mapOptional("PenaltyBreakOpenParenthesis", + Style.PenaltyBreakOpenParenthesis); IO.mapOptional("PenaltyBreakString", Style.PenaltyBreakString); IO.mapOptional("PenaltyBreakTemplateDeclaration", Style.PenaltyBreakTemplateDeclaration); @@ -1232,6 +1234,7 @@ LLVMStyle.PenaltyExcessCharacter = 1000000; LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60; LLVMStyle.PenaltyBreakBeforeFirstCallParameter = 19; + LLVMStyle.PenaltyBreakOpenParenthesis = 0; LLVMStyle.PenaltyBreakTemplateDeclaration = prec::Relational; LLVMStyle.PenaltyIndentedWhitespace = 0; diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2857,6 +2857,8 @@ Left.Previous->isOneOf(tok::identifier, tok::greater)) return 500; + if (Left.is(tok::l_paren) && Style.PenaltyBreakOpenParenthesis != 0) + return Style.PenaltyBreakOpenParenthesis; if (Left.is(tok::l_paren) && InFunctionDecl && Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign) return 100; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -18512,6 +18512,75 @@ format("int a = /* long block comment */ 42;", Style)); } +TEST_F(FormatTest, BreakPenaltyAfterLParen) { + FormatStyle Style = getLLVMStyle(); + Style.ColumnLimit = 8; + Style.PenaltyExcessCharacter = 15; + EXPECT_EQ("int foo(\n" + " int aaaaaaaaaaaaaaaaaaaaaaaa);", + format("int foo(\n" + " int aaaaaaaaaaaaaaaaaaaaaaaa);", + Style)); + Style.PenaltyBreakOpenParenthesis = 200; + EXPECT_EQ("int foo(int aaaaaaaaaaaaaaaaaaaaaaaa);", + format("int foo(\n" + " int aaaaaaaaaaaaaaaaaaaaaaaa);", + Style)); +} + +TEST_F(FormatTest, BreakPenaltyAfterCastLParen) { + FormatStyle Style = getLLVMStyle(); + Style.ColumnLimit = 5; + Style.PenaltyExcessCharacter = 150; + EXPECT_EQ("foo((\n" + " int)aaaaaaaaaaaaaaaaaaaaaaaa);", + format("foo((\n" + "int)aaaaaaaaaaaaaaaaaaaaaaaa);", + Style)); + Style.PenaltyBreakOpenParenthesis = 100000; + EXPECT_EQ("foo((int)\n" + " aaaaaaaaaaaaaaaaaaaaaaaa);", + format("foo((\n" + "int)aaaaaaaaaaaaaaaaaaaaaaaa);", + Style)); +} + +TEST_F(FormatTest, BreakPenaltyAfterForLoopLParen) { + FormatStyle Style = getLLVMStyle(); + Style.ColumnLimit = 4; + Style.PenaltyExcessCharacter = 100; + EXPECT_EQ("for (\n" + " int iiiiiiiiiiiiiiiii =\n" + " 0;\n" + " iiiiiiiiiiiiiiiii <\n" + " 2;\n" + " iiiiiiiiiiiiiiiii++) {\n" + "}", + format("for (\n" + " int iiiiiiiiiiiiiiiii =\n" + " 0;\n" + " iiiiiiiiiiiiiiiii <\n" + " 2;\n" + " iiiiiiiiiiiiiiiii++) {\n" + "}", + Style)); + Style.PenaltyBreakOpenParenthesis = 1250; + EXPECT_EQ("for (int iiiiiiiiiiiiiiiii =\n" + " 0;\n" + " iiiiiiiiiiiiiiiii <\n" + " 2;\n" + " iiiiiiiiiiiiiiiii++) {\n" + "}", + format("for (\n" + " int iiiiiiiiiiiiiiiii =\n" + " 0;\n" + " iiiiiiiiiiiiiiiii <\n" + " 2;\n" + " iiiiiiiiiiiiiiiii++) {\n" + "}", + Style)); +} + #define EXPECT_ALL_STYLES_EQUAL(Styles) \ for (size_t i = 1; i < Styles.size(); ++i) \ EXPECT_EQ(Styles[0], Styles[i]) \ @@ -18717,6 +18786,8 @@ PenaltyBreakBeforeFirstCallParameter, 1234u); CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234", PenaltyBreakTemplateDeclaration, 1234u); + CHECK_PARSE("PenaltyBreakOpenParenthesis: 1234", PenaltyBreakOpenParenthesis, + 1234u); CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u); CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234", PenaltyReturnTypeOnItsOwnLine, 1234u);