Skip to content

Commit

Permalink
Don’t break before nested block param when prior param is not a block
Browse files Browse the repository at this point in the history
Add ScopedTrace to verify methods in FormatTestObjC
Add tests from D17700

Reviewed By: keith, kastiglione

Differential Revision: https://reviews.llvm.org/D91669
  • Loading branch information
segiddins authored and keith committed Nov 20, 2020
1 parent 20c43d6 commit 244022a
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 3 deletions.
4 changes: 3 additions & 1 deletion clang/lib/Format/ContinuationIndenter.cpp
Expand Up @@ -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);
Expand Down
44 changes: 42 additions & 2 deletions clang/unittests/Format/FormatTestObjC.cpp
Expand Up @@ -18,6 +18,7 @@
#define DEBUG_TYPE "format-test"

using clang::tooling::ReplacementTest;
using testing::internal::ScopedTrace;

namespace clang {
namespace format {
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 244022a

Please sign in to comment.