[clang-format] Do not break after ObjC category open paren
Summary: Previously, `clang-format` would break Objective-C category extensions after the opening parenthesis to avoid breaking the protocol list: ``` % echo "@interface ccccccccccccc (ccccccccccc) <ccccccccccccc> { }" | \ clang-format -assume-filename=foo.h -style="{BasedOnStyle: llvm, \ ColumnLimit: 40}" @interface ccccccccccccc ( ccccccccccc) <ccccccccccccc> { } ``` This looks fairly odd, as we could have kept the category extension on the previous line. Category extensions are a single item, so they are generally very short compared to protocol lists. We should prefer breaking after the opening `<` of the protocol list over breaking after the opening `(` of the category extension. With this diff, we now avoid breaking after the category extension's open paren, which causes us to break after the protocol list's open angle bracket: ``` % echo "@interface ccccccccccccc (ccccccccccc) <ccccccccccccc> { }" | \ ./bin/clang-format -assume-filename=foo.h -style="{BasedOnStyle: llvm, \ ColumnLimit: 40}" @interface ccccccccccccc (ccccccccccc) < ccccccccccccc> { } ``` Test Plan: New test added. Confirmed test failed before diff and passed after diff by running: % make -j16 FormatTests && ./tools/clang/unittests/Format/FormatTests Reviewers: djasper, jolesiak Reviewed By: djasper Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D45526 llvm-svn: 329919
This commit is contained in:
parent
b1a7919e4c
commit
01cbd5aa68
|
@ -2272,6 +2272,13 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
if (Left.is(tok::colon) && Left.is(TT_ObjCMethodExpr))
|
||||
return Line.MightBeFunctionDecl ? 50 : 500;
|
||||
|
||||
// In Objective-C type declarations, avoid breaking after the category's
|
||||
// open paren (we'll prefer breaking after the protocol list's opening
|
||||
// angle bracket, if present).
|
||||
if (Line.Type == LT_ObjCDecl && Left.is(tok::l_paren) && Left.Previous &&
|
||||
Left.Previous->isOneOf(tok::identifier, tok::greater))
|
||||
return 500;
|
||||
|
||||
if (Left.is(tok::l_paren) && InFunctionDecl &&
|
||||
Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign)
|
||||
return 100;
|
||||
|
|
|
@ -334,6 +334,9 @@ TEST_F(FormatTestObjC, FormatObjCInterface) {
|
|||
" ccccccccccccc, ccccccccccccc,\n"
|
||||
" ccccccccccccc, ccccccccccccc> {\n"
|
||||
"}");
|
||||
verifyFormat("@interface ccccccccccccc (ccccccccccc) <\n"
|
||||
" ccccccccccccc> {\n"
|
||||
"}");
|
||||
Style.ObjCBinPackProtocolList = FormatStyle::BPS_Never;
|
||||
verifyFormat("@interface ddddddddddddd () <\n"
|
||||
" ddddddddddddd,\n"
|
||||
|
|
Loading…
Reference in New Issue