summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hamilton <benhamilton@google.com>2018-04-12 15:11:55 +0000
committerBen Hamilton <benhamilton@google.com>2018-04-12 15:11:55 +0000
commit01cbd5aa686b7b50cf5b099c8a37b6ac2cfd05df (patch)
tree6745e90cebebe99ce5a55ddc574afe629f111f6a
parentb1a7919e4cd0175ec08a3efb3c183913e21628ba (diff)
downloadbcm5719-llvm-01cbd5aa686b7b50cf5b099c8a37b6ac2cfd05df.tar.gz
bcm5719-llvm-01cbd5aa686b7b50cf5b099c8a37b6ac2cfd05df.zip
[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
-rw-r--r--clang/lib/Format/TokenAnnotator.cpp7
-rw-r--r--clang/unittests/Format/FormatTestObjC.cpp3
2 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 60244924079..49e21520b70 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -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;
diff --git a/clang/unittests/Format/FormatTestObjC.cpp b/clang/unittests/Format/FormatTestObjC.cpp
index 9c8f252143f..b878d7886e1 100644
--- a/clang/unittests/Format/FormatTestObjC.cpp
+++ b/clang/unittests/Format/FormatTestObjC.cpp
@@ -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"
OpenPOWER on IntegriCloud