From: Ben Hamilton Date: Fri, 19 Jul 2019 16:50:24 +0000 (+0000) Subject: [Format/ObjC] Avoid breaking between unary operators and operands X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ada9d5e815fb4a60eb2a91d649bb3b15b33b6a57;p=clang [Format/ObjC] Avoid breaking between unary operators and operands Summary: Test Plan: New tests added. Ran tests with: % ninja FormatTests && ./tools/clang/unittests/Format/FormatTests Confirmed tests failed before change and passed after change. Reviewers: krasimir, djasper, sammccall, klimek Reviewed By: sammccall Subscribers: klimek, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64775 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@366592 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 490c4f4613..d105d619af 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -2429,6 +2429,8 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, if (Left.is(TT_JavaAnnotation)) return 50; + if (Left.is(TT_UnaryOperator)) + return 60; if (Left.isOneOf(tok::plus, tok::comma) && Left.Previous && Left.Previous->isLabelString() && (Left.NextOperator || Left.OperatorIndex != 0)) diff --git a/unittests/Format/FormatTestObjC.cpp b/unittests/Format/FormatTestObjC.cpp index b859d92a89..b1e289d89b 100644 --- a/unittests/Format/FormatTestObjC.cpp +++ b/unittests/Format/FormatTestObjC.cpp @@ -886,6 +886,18 @@ TEST_F(FormatTestObjC, FormatObjCMethodExpr) { " bb:42\n" " cc:42];"); + // Avoid breaking between unary operators and ObjC method expressions. + Style.ColumnLimit = 45; + verifyFormat("if (a012345678901234567890123 &&\n" + " ![foo bar]) {\n" + "}"); + verifyFormat("if (a012345678901234567890123 &&\n" + " +[foo bar]) {\n" + "}"); + verifyFormat("if (a012345678901234567890123 &&\n" + " -[foo bar]) {\n" + "}"); + Style.ColumnLimit = 70; verifyFormat( "void f() {\n"