Author: typz Date: Tue Feb 27 05:48:27 2018 New Revision: 326192 URL: http://llvm.org/viewvc/llvm-project?rev=326192&view=rev Log: clang-format: use AfterControlStatement to format ObjC control blocks
ObjC defines `@autoreleasepool` and `@synchronized` control blocks. These used to be formatted according to the `AfterObjCDeclaration` brace- wrapping flag, which is not very consistent. This patch changes the behavior to use the `AfterControlStatement` flag instead. This should not affect the behavior unless a custom brace wrapping mode is used. Reviewers: krasimir, djasper, klimek, benhamilton Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D43232 Modified: cfe/trunk/include/clang/Format/Format.h cfe/trunk/lib/Format/UnwrappedLineFormatter.cpp cfe/trunk/lib/Format/UnwrappedLineParser.cpp cfe/trunk/unittests/Format/FormatTestObjC.cpp Modified: cfe/trunk/include/clang/Format/Format.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=326192&r1=326191&r2=326192&view=diff ============================================================================== --- cfe/trunk/include/clang/Format/Format.h (original) +++ cfe/trunk/include/clang/Format/Format.h Tue Feb 27 05:48:27 2018 @@ -662,7 +662,9 @@ struct FormatStyle { /// } /// \endcode bool AfterNamespace; - /// \brief Wrap ObjC definitions (``@autoreleasepool``, interfaces, ..). + /// \brief Wrap ObjC definitions (interfaces, implementations...). + /// \note @autoreleasepool and @synchronized blocks are wrapped + /// according to `AfterControlStatement` flag. bool AfterObjCDeclaration; /// \brief Wrap struct definitions. /// \code Modified: cfe/trunk/lib/Format/UnwrappedLineFormatter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineFormatter.cpp?rev=326192&r1=326191&r2=326192&view=diff ============================================================================== --- cfe/trunk/lib/Format/UnwrappedLineFormatter.cpp (original) +++ cfe/trunk/lib/Format/UnwrappedLineFormatter.cpp Tue Feb 27 05:48:27 2018 @@ -314,6 +314,14 @@ private: } return MergedLines; } + // Don't merge block with left brace wrapped after ObjC special blocks + if (TheLine->First->is(tok::l_brace) && I != AnnotatedLines.begin() && + I[-1]->First->is(tok::at) && I[-1]->First->Next) { + tok::ObjCKeywordKind kwId = I[-1]->First->Next->Tok.getObjCKeywordID(); + if (kwId == clang::tok::objc_autoreleasepool || + kwId == clang::tok::objc_synchronized) + return 0; + } // Try to merge a block with left brace wrapped that wasn't yet covered if (TheLine->Last->is(tok::l_brace)) { return !Style.BraceWrapping.AfterFunction || Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=326192&r1=326191&r2=326192&view=diff ============================================================================== --- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original) +++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Tue Feb 27 05:48:27 2018 @@ -1129,7 +1129,7 @@ void UnwrappedLineParser::parseStructura case tok::objc_autoreleasepool: nextToken(); if (FormatTok->Tok.is(tok::l_brace)) { - if (Style.BraceWrapping.AfterObjCDeclaration) + if (Style.BraceWrapping.AfterControlStatement) addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); } @@ -1141,7 +1141,7 @@ void UnwrappedLineParser::parseStructura // Skip synchronization object parseParens(); if (FormatTok->Tok.is(tok::l_brace)) { - if (Style.BraceWrapping.AfterObjCDeclaration) + if (Style.BraceWrapping.AfterControlStatement) addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); } Modified: cfe/trunk/unittests/Format/FormatTestObjC.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTestObjC.cpp?rev=326192&r1=326191&r2=326192&view=diff ============================================================================== --- cfe/trunk/unittests/Format/FormatTestObjC.cpp (original) +++ cfe/trunk/unittests/Format/FormatTestObjC.cpp Tue Feb 27 05:48:27 2018 @@ -187,7 +187,8 @@ TEST_F(FormatTestObjC, FormatObjCAutorel "@autoreleasepool {\n" " f();\n" "}\n"); - Style.BreakBeforeBraces = FormatStyle::BS_Allman; + Style.BreakBeforeBraces = FormatStyle::BS_Custom; + Style.BraceWrapping.AfterControlStatement = true; verifyFormat("@autoreleasepool\n" "{\n" " f();\n" @@ -216,7 +217,8 @@ TEST_F(FormatTestObjC, FormatObjCSynchro "@synchronized(self) {\n" " f();\n" "}\n"); - Style.BreakBeforeBraces = FormatStyle::BS_Allman; + Style.BreakBeforeBraces = FormatStyle::BS_Custom; + Style.BraceWrapping.AfterControlStatement = true; verifyFormat("@synchronized(self)\n" "{\n" " f();\n" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits