Author: Samuel Giddins Date: 2020-11-20T15:16:04-08:00 New Revision: 244022a3cd75b51dcf1d2a5a822419492ce79e47
URL: https://github.com/llvm/llvm-project/commit/244022a3cd75b51dcf1d2a5a822419492ce79e47 DIFF: https://github.com/llvm/llvm-project/commit/244022a3cd75b51dcf1d2a5a822419492ce79e47.diff LOG: Don’t break before nested block param when prior param is not a block Add ScopedTrace to verify methods in FormatTestObjC Add tests from D17700 Reviewed By: keith, kastiglione Differential Revision: https://reviews.llvm.org/D91669 Added: Modified: clang/lib/Format/ContinuationIndenter.cpp clang/unittests/Format/FormatTestObjC.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index d99107cb8b2c..d811f0f9e531 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -400,7 +400,9 @@ bool ContinuationIndenter::mustBreak(const LineState &State) { return true; if (Current.is(TT_SelectorName) && !Previous.is(tok::at) && State.Stack.back().ObjCSelectorNameFound && - State.Stack.back().BreakBeforeParameter) + State.Stack.back().BreakBeforeParameter && + (Style.ObjCBreakBeforeNestedBlockParam || + !Current.startsSequence(TT_SelectorName, tok::colon, tok::caret))) return true; unsigned NewLineColumn = getNewLineColumn(State); diff --git a/clang/unittests/Format/FormatTestObjC.cpp b/clang/unittests/Format/FormatTestObjC.cpp index a34a0832286b..c33f93bcf99d 100644 --- a/clang/unittests/Format/FormatTestObjC.cpp +++ b/clang/unittests/Format/FormatTestObjC.cpp @@ -18,6 +18,7 @@ #define DEBUG_TYPE "format-test" using clang::tooling::ReplacementTest; +using testing::internal::ScopedTrace; namespace clang { namespace format { @@ -51,18 +52,24 @@ class FormatTestObjC : public ::testing::Test { return *Result; } - void verifyFormat(StringRef Code) { + void _verifyFormat(const char *File, int Line, StringRef Code) { + ScopedTrace t(File, Line, ::testing::Message() << Code.str()); EXPECT_EQ(Code.str(), format(Code)) << "Expected code is not stable"; EXPECT_EQ(Code.str(), format(test::messUp(Code))); } - void verifyIncompleteFormat(StringRef Code) { + void _verifyIncompleteFormat(const char *File, int Line, StringRef Code) { + ScopedTrace t(File, Line, ::testing::Message() << Code.str()); EXPECT_EQ(Code.str(), format(test::messUp(Code), SC_ExpectIncomplete)); } FormatStyle Style; }; +#define verifyIncompleteFormat(...) \ + _verifyIncompleteFormat(__FILE__, __LINE__, __VA_ARGS__) +#define verifyFormat(...) _verifyFormat(__FILE__, __LINE__, __VA_ARGS__) + TEST(FormatTestObjCStyle, DetectsObjCInHeaders) { auto Style = getStyle("LLVM", "a.h", "none", "@interface\n" @@ -1453,6 +1460,39 @@ TEST_F(FormatTestObjC, BreakLineBeforeNestedBlockParam) { " callback:^(typeof(self) self, NSNumber *u, NSNumber *v) {\n" " u = v;\n" " }]"); + + verifyFormat("[self block:^(void) {\n" + " doStuff();\n" + "} completionHandler:^(void) {\n" + " doStuff();\n" + " [self block:^(void) {\n" + " doStuff();\n" + " } completionHandler:^(void) {\n" + " doStuff();\n" + " }];\n" + "}];"); + + Style.ColumnLimit = 0; + verifyFormat("[[SessionService sharedService] " + "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" + " if (window) {\n" + " [self windowDidLoad:window];\n" + " } else {\n" + " [self errorLoadingWindow];\n" + " }\n" + "}];"); + verifyFormat("[controller test:^{\n" + " doStuff();\n" + "} withTimeout:5 completionHandler:^{\n" + " doStuff();\n" + "}];"); + verifyFormat( + "[self setupTextFieldSignals:@[\n" + " self.documentWidthField,\n" + " self.documentHeightField,\n" + "] solver:^(NSTextField *textField) {\n" + " return [self.representedObject solveEquationForTextField:textField];\n" + "}];"); } TEST_F(FormatTestObjC, IfNotUnlikely) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits