Skip to content

Commit c6b6285

Browse files
committed
[clang-format] Reorder TokenAnnotator::canBreakBefore
Move the checks related to breaking before right braces and right parens earlier to avoid conflicting checks that prevent breaking based on the left-hand token. This allows properly formatting declarations with pointers and references.
1 parent 516d6ed commit c6b6285

File tree

2 files changed

+43
-28
lines changed

2 files changed

+43
-28
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6105,6 +6105,33 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
61056105
return false;
61066106
}
61076107

6108+
// We only break before r_brace if there was a corresponding break before
6109+
// the l_brace, which is tracked by BreakBeforeClosingBrace.
6110+
if (Right.is(tok::r_brace)) {
6111+
return Right.MatchingParen && (Right.MatchingParen->is(BK_Block) ||
6112+
(Right.isBlockIndentedInitRBrace(Style)));
6113+
}
6114+
6115+
// We only break before r_paren if we're in a block indented context.
6116+
if (Right.is(tok::r_paren)) {
6117+
if (Style.AlignAfterOpenBracket != FormatStyle::BAS_BlockIndent ||
6118+
!Right.MatchingParen) {
6119+
return false;
6120+
}
6121+
auto Next = Right.Next;
6122+
if (Next && Next->is(tok::r_paren))
6123+
Next = Next->Next;
6124+
if (Next && Next->is(tok::l_paren))
6125+
return false;
6126+
const FormatToken *Previous = Right.MatchingParen->Previous;
6127+
return !(Previous && (Previous->is(tok::kw_for) || Previous->isIf()));
6128+
}
6129+
6130+
if (Left.isOneOf(tok::r_paren, TT_TrailingAnnotation) &&
6131+
Right.is(TT_TrailingAnnotation) &&
6132+
Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) {
6133+
return false;
6134+
}
61086135
if (Left.is(tok::at))
61096136
return false;
61106137
if (Left.Tok.getObjCKeywordID() == tok::objc_interface)
@@ -6260,34 +6287,6 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
62606287
return false;
62616288
}
62626289

6263-
// We only break before r_brace if there was a corresponding break before
6264-
// the l_brace, which is tracked by BreakBeforeClosingBrace.
6265-
if (Right.is(tok::r_brace)) {
6266-
return Right.MatchingParen && (Right.MatchingParen->is(BK_Block) ||
6267-
(Right.isBlockIndentedInitRBrace(Style)));
6268-
}
6269-
6270-
// We only break before r_paren if we're in a block indented context.
6271-
if (Right.is(tok::r_paren)) {
6272-
if (Style.AlignAfterOpenBracket != FormatStyle::BAS_BlockIndent ||
6273-
!Right.MatchingParen) {
6274-
return false;
6275-
}
6276-
auto Next = Right.Next;
6277-
if (Next && Next->is(tok::r_paren))
6278-
Next = Next->Next;
6279-
if (Next && Next->is(tok::l_paren))
6280-
return false;
6281-
const FormatToken *Previous = Right.MatchingParen->Previous;
6282-
return !(Previous && (Previous->is(tok::kw_for) || Previous->isIf()));
6283-
}
6284-
6285-
if (Left.isOneOf(tok::r_paren, TT_TrailingAnnotation) &&
6286-
Right.is(TT_TrailingAnnotation) &&
6287-
Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) {
6288-
return false;
6289-
}
6290-
62916290
// Allow breaking after a trailing annotation, e.g. after a method
62926291
// declaration.
62936292
if (Left.is(TT_TrailingAnnotation)) {

clang/unittests/Format/FormatTest.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9383,6 +9383,13 @@ TEST_F(FormatTest, AlignsAfterOpenBracket) {
93839383
" aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
93849384
" aaaaaaaaaaaaaaaa);",
93859385
Style);
9386+
verifyFormat("void foo(\n"
9387+
" void (*foobarpntr)(\n"
9388+
" aaaaaaaaaaaaaaaaaa *,\n"
9389+
" bbbbbbbbbbbbbb *,\n"
9390+
" cccccccccccccccccccc *,\n"
9391+
" dddddddddddddddddd *));",
9392+
Style);
93869393
verifyFormat(
93879394
"fooooooooooo(new BARRRRRRRRR(\n"
93889395
" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZZZZZZZZZZZZZZZZZZZZZZZZZ()));",
@@ -9441,6 +9448,15 @@ TEST_F(FormatTest, AlignsAfterOpenBracket) {
94419448
" aaaaaaaaaaaaaaaa\n"
94429449
");",
94439450
Style);
9451+
verifyFormat("void foo(\n"
9452+
" void (*foobarpntr)(\n"
9453+
" aaaaaaaaaaaaaaaaaa *,\n"
9454+
" bbbbbbbbbbbbbb *,\n"
9455+
" cccccccccccccccccccc *,\n"
9456+
" dddddddddddddddddd *\n"
9457+
" )\n"
9458+
");",
9459+
Style);
94449460
verifyFormat("aaaaaaa<bbbbbbbb> const aaaaaaaaaa{\n"
94459461
" aaaaaaaaaaaaa(aaaaaaaaaaa, aaaaaaaaaaaaaaaa)\n"
94469462
"};",

0 commit comments

Comments
 (0)