clang-format: fix formatting of ObjC @synchronized blocks

Summary:
The blocks used to be formatted using the "default" behavior, and would
thus be mistaken for function calls followed by blocks: this could lead
to unexpected inlining of the block and extra line-break before the
opening brace.

They are now formatted similarly to `@autoreleasepool` blocks, as
expected:

  @synchronized(self) {
      f();
  }

Reviewers: krasimir, djasper, klimek

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D43114

llvm-svn: 326191
This commit is contained in:
Francois Ferrand 2018-02-27 13:48:21 +00:00
parent ba43ec8702
commit ba91c3de38
2 changed files with 30 additions and 0 deletions

View File

@ -1135,6 +1135,18 @@ void UnwrappedLineParser::parseStructuralElement() {
}
addUnwrappedLine();
return;
case tok::objc_synchronized:
nextToken();
if (FormatTok->Tok.is(tok::l_paren))
// Skip synchronization object
parseParens();
if (FormatTok->Tok.is(tok::l_brace)) {
if (Style.BraceWrapping.AfterObjCDeclaration)
addUnwrappedLine();
parseBlock(/*MustBeDeclaration=*/false);
}
addUnwrappedLine();
return;
case tok::objc_try:
// This branch isn't strictly necessary (the kw_try case below would
// do this too after the tok::at is parsed above). But be explicit.

View File

@ -209,6 +209,24 @@ TEST_F(FormatTestObjC, FormatObjCGenerics) {
" aaaaaaaaaaaaaaaaa);\n");
}
TEST_F(FormatTestObjC, FormatObjCSynchronized) {
verifyFormat("@synchronized(self) {\n"
" f();\n"
"}\n"
"@synchronized(self) {\n"
" f();\n"
"}\n");
Style.BreakBeforeBraces = FormatStyle::BS_Allman;
verifyFormat("@synchronized(self)\n"
"{\n"
" f();\n"
"}\n"
"@synchronized(self)\n"
"{\n"
" f();\n"
"}\n");
}
TEST_F(FormatTestObjC, FormatObjCInterface) {
verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
"@public\n"