[clang] b40e9dc - [clang-format] Avoid breaking )( with BlockIndent
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 6 01:05:01 PST 2022
Author: Gedare Bloom
Date: 2022-12-06T01:04:51-08:00
New Revision: b40e9dce0a67beab352f7b7be43f13190f69b69c
URL: https://github.com/llvm/llvm-project/commit/b40e9dce0a67beab352f7b7be43f13190f69b69c
DIFF: https://github.com/llvm/llvm-project/commit/b40e9dce0a67beab352f7b7be43f13190f69b69c.diff
LOG: [clang-format] Avoid breaking )( with BlockIndent
The BracketAlignmentStyle BAS_BlockIndent was forcing breaks before a
closing right parenthesis yielding strange-looking results in case of
code structures that have a left parens immediately following a right
parens ")(" such as is seen with indirect function calls via function
pointers and with type casting.
Fixes 57250.
Fixes 58496.
Differential Revision: https://reviews.llvm.org/D137762
Added:
Modified:
clang/lib/Format/ContinuationIndenter.cpp
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 4e5672f244bf8..6c8f7eb6e2902 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -720,8 +720,9 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
(Previous.is(tok::l_brace) && Previous.isNot(BK_Block) &&
Style.Cpp11BracedListStyle)) &&
State.Column > getNewLineColumn(State) &&
- (!Previous.Previous || !Previous.Previous->isOneOf(
- tok::kw_for, tok::kw_while, tok::kw_switch)) &&
+ (!Previous.Previous ||
+ !Previous.Previous->isOneOf(TT_CastRParen, tok::kw_for, tok::kw_while,
+ tok::kw_switch)) &&
// Don't do this for simple (no expressions) one-argument function calls
// as that feels like needlessly wasting whitespace, e.g.:
//
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 889dfa5fd7a63..cc0b7719b9e52 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -5016,6 +5016,11 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
!Right.MatchingParen) {
return false;
}
+ auto Next = Right.Next;
+ if (Next && Next->is(tok::r_paren))
+ Next = Next->Next;
+ if (Next && Next->is(tok::l_paren))
+ return false;
const FormatToken *Previous = Right.MatchingParen->Previous;
return !(Previous && (Previous->is(tok::kw_for) || Previous->isIf()));
}
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 1db8ee94369b7..f895eb4f8df89 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -7451,7 +7451,7 @@ TEST_F(FormatTest, AllowAllArgumentsOnNextLineDontAlign) {
"void functionDecl(int A, int B,\n"
" int C);"),
format(Input, Style));
- // However, BAS_AlwaysBreak should take precedence over
+ // However, BAS_AlwaysBreak and BAS_BlockIndent should take precedence over
// AllowAllArgumentsOnNextLine.
Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
EXPECT_EQ(StringRef("functionCall(\n"
@@ -7459,6 +7459,14 @@ TEST_F(FormatTest, AllowAllArgumentsOnNextLineDontAlign) {
"void functionDecl(\n"
" int A, int B, int C);"),
format(Input, Style));
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent;
+ verifyFormat("functionCall(\n"
+ " paramA, paramB, paramC\n"
+ ");\n"
+ "void functionDecl(\n"
+ " int A, int B, int C\n"
+ ");",
+ Input, Style);
// When AllowAllArgumentsOnNextLine is set, we prefer breaking before the
// first argument.
@@ -8661,6 +8669,52 @@ TEST_F(FormatTest, AlignsAfterOpenBracket) {
" aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
" aaaaaaaaaaaaaaaa);",
Style);
+
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent;
+ Style.BinPackArguments = false;
+ Style.BinPackParameters = false;
+ verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
+ " aaaaaaaaaaa aaaaaaaa,\n"
+ " aaaaaaaaa aaaaaaa,\n"
+ " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
+ ") {}",
+ Style);
+ verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
+ " aaaaaaaaaaa aaaaaaaaa,\n"
+ " aaaaaaaaaaa aaaaaaaaa,\n"
+ " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
+ ");",
+ Style);
+ verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
+ " aaaaaaaaaaaaaaa,\n"
+ " aaaaaaaaaaaaaaaaaaaaa,\n"
+ " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
+ "));",
+ Style);
+ verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
+ " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)\n"
+ "));",
+ Style);
+ verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
+ " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)\n"
+ "));",
+ Style);
+ verifyFormat(
+ "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
+ " aaaaaaaaaaaaaaaaaaaaa(\n"
+ " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)\n"
+ " ),\n"
+ " aaaaaaaaaaaaaaaa\n"
+ ");",
+ Style);
+ verifyFormat(
+ "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
+ " aaaaaaaaaaaaaaaaaaaaa(\n"
+ " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)\n"
+ " ) &&\n"
+ " aaaaaaaaaaaaaaaa\n"
+ ");",
+ Style);
}
TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
@@ -14580,6 +14634,13 @@ TEST_F(FormatTest, BreaksStringLiteralOperands) {
" \"long\",\n"
" a);",
format("someFunction(\"long long long long\", a);", Style));
+ Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent;
+ verifyFormat("someFunction(\n"
+ " \"long long long \"\n"
+ " \"long\",\n"
+ " a\n"
+ ");",
+ Style);
}
TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
@@ -16303,6 +16364,23 @@ TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
" FoooooooooLooooong);\n"
"}",
Spaces);
+
+ Spaces.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent;
+ verifyFormat("void foo( ) {\n"
+ " size_t foo = (*(function))(\n"
+ " Foooo, Barrrrr, Foooo, Barrrr, FoooooooooLooooong, "
+ "BarrrrrrrrrrrrLong,\n"
+ " FoooooooooLooooong\n"
+ " );\n"
+ "}",
+ Spaces);
+ verifyFormat("size_t idx = (size_t)(ptr - ((char *)file));", Spaces);
+ verifyFormat("size_t idx = (size_t)a;", Spaces);
+ verifyFormat("size_t idx = (size_t)(a - 1);", Spaces);
+ verifyFormat("size_t idx = (a->*foo)(a - 1);", Spaces);
+ verifyFormat("size_t idx = (a->foo)(a - 1);", Spaces);
+ verifyFormat("size_t idx = (*foo)(a - 1);", Spaces);
+ verifyFormat("size_t idx = (*(foo))(a - 1);", Spaces);
}
TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
More information about the cfe-commits
mailing list