r289428 - clang-format: Separate out a language kind for ObjC.

Daniel Jasper via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 31 11:02:32 PST 2017


Sorry about that. It was intentional, but I totally forgot about Chromium
style. And yes, should have mentioned this in the CL description :-(.

On Tue, Jan 31, 2017 at 7:32 PM, Nico Weber <thakis at chromium.org> wrote:

> This also changed the column limit for Obj-C files to 100 columns. Given
> that that wasn't mentioned in the CL description, was that intentional?
> https://google.github.io/styleguide/objcguide.xml#Line_Length says either
> is fine.
>
> (Don't care which way it goes, but since the CL description didn't mention
> that I missed it, and it's wrong for Chromium style. And now we rolled in
> this revision and our roll failed due to this change.)
>
> On Mon, Dec 12, 2016 at 4:42 AM, Daniel Jasper via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: djasper
>> Date: Mon Dec 12 06:42:29 2016
>> New Revision: 289428
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=289428&view=rev
>> Log:
>> clang-format: Separate out a language kind for ObjC.
>>
>> While C(++) and ObjC are generally formatted the same way and can be
>> mixed, people might want to choose different styles based on the
>> language. This patch recognizes .m and .mm files as ObjC and also
>> implements a very crude detection of whether or not a .h file contains
>> ObjC code. This can be improved over time.
>>
>> Also move most of the ObjC tests into their own test file to keep file
>> size maintainable.
>>
>> Added:
>>     cfe/trunk/unittests/Format/FormatTestObjC.cpp
>> Modified:
>>     cfe/trunk/include/clang/Format/Format.h
>>     cfe/trunk/lib/Format/ContinuationIndenter.cpp
>>     cfe/trunk/lib/Format/Format.cpp
>>     cfe/trunk/lib/Format/FormatTokenLexer.cpp
>>     cfe/trunk/lib/Format/TokenAnnotator.cpp
>>     cfe/trunk/tools/clang-format/ClangFormat.cpp
>>     cfe/trunk/unittests/Format/CMakeLists.txt
>>     cfe/trunk/unittests/Format/FormatTest.cpp
>>     cfe/trunk/unittests/Tooling/ReplacementTest.h
>>
>> Modified: cfe/trunk/include/clang/Format/Format.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/
>> Format/Format.h?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/include/clang/Format/Format.h (original)
>> +++ cfe/trunk/include/clang/Format/Format.h Mon Dec 12 06:42:29 2016
>> @@ -465,6 +465,8 @@ struct FormatStyle {
>>      LK_Java,
>>      /// Should be used for JavaScript.
>>      LK_JavaScript,
>> +    /// Should be used for ObjC code.
>> +    LK_ObjC,
>>      /// Should be used for Protocol Buffers
>>      /// (https://developers.google.com/protocol-buffers/).
>>      LK_Proto,
>> @@ -852,13 +854,16 @@ extern const char *StyleOptionHelpDescri
>>  /// == "file".
>>  /// \param[in] FallbackStyle The name of a predefined style used to
>> fallback to
>>  /// in case the style can't be determined from \p StyleName.
>> +/// \param[in] Code The actual code to be formatted. Used to determine
>> the
>> +/// language if the filename isn't sufficient.
>>  /// \param[in] FS The underlying file system, in which the file resides.
>> By
>>  /// default, the file system is the real file system.
>>  ///
>>  /// \returns FormatStyle as specified by ``StyleName``. If no style
>> could be
>>  /// determined, the default is LLVM Style (see ``getLLVMStyle()``).
>>  FormatStyle getStyle(StringRef StyleName, StringRef FileName,
>> -                     StringRef FallbackStyle, vfs::FileSystem *FS =
>> nullptr);
>> +                     StringRef FallbackStyle, StringRef Code = "",
>> +                     vfs::FileSystem *FS = nullptr);
>>
>>  // \brief Returns a string representation of ``Language``.
>>  inline StringRef getLanguageName(FormatStyle::LanguageKind Language) {
>>
>> Modified: cfe/trunk/lib/Format/ContinuationIndenter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Con
>> tinuationIndenter.cpp?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Format/ContinuationIndenter.cpp (original)
>> +++ cfe/trunk/lib/Format/ContinuationIndenter.cpp Mon Dec 12 06:42:29
>> 2016
>> @@ -560,6 +560,7 @@ unsigned ContinuationIndenter::addTokenO
>>    // and we need to avoid bin packing there.
>>    bool NestedBlockSpecialCase =
>>        Style.Language != FormatStyle::LK_Cpp &&
>> +      Style.Language != FormatStyle::LK_ObjC &&
>>        Current.is(tok::r_brace) && State.Stack.size() > 1 &&
>>        State.Stack[State.Stack.size() - 2].NestedBlockInlined;
>>    if (!NestedBlockSpecialCase)
>>
>> Modified: cfe/trunk/lib/Format/Format.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/For
>> mat.cpp?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Format/Format.cpp (original)
>> +++ cfe/trunk/lib/Format/Format.cpp Mon Dec 12 06:42:29 2016
>> @@ -52,6 +52,7 @@ template <> struct ScalarEnumerationTrai
>>      IO.enumCase(Value, "Cpp", FormatStyle::LK_Cpp);
>>      IO.enumCase(Value, "Java", FormatStyle::LK_Java);
>>      IO.enumCase(Value, "JavaScript", FormatStyle::LK_JavaScript);
>> +    IO.enumCase(Value, "ObjC", FormatStyle::LK_ObjC);
>>      IO.enumCase(Value, "Proto", FormatStyle::LK_Proto);
>>      IO.enumCase(Value, "TableGen", FormatStyle::LK_TableGen);
>>    }
>> @@ -623,6 +624,8 @@ FormatStyle getGoogleStyle(FormatStyle::
>>    } else if (Language == FormatStyle::LK_Proto) {
>>      GoogleStyle.AllowShortFunctionsOnASingleLine =
>> FormatStyle::SFS_None;
>>      GoogleStyle.SpacesInContainerLiterals = false;
>> +  } else if (Language == FormatStyle::LK_ObjC) {
>> +    GoogleStyle.ColumnLimit = 100;
>>    }
>>
>>    return GoogleStyle;
>> @@ -1861,6 +1864,8 @@ static FormatStyle::LanguageKind getLang
>>      return FormatStyle::LK_Java;
>>    if (FileName.endswith_lower(".js") || FileName.endswith_lower(".ts"))
>>      return FormatStyle::LK_JavaScript; // JavaScript or TypeScript.
>> +  if (FileName.endswith(".m") || FileName.endswith(".mm"))
>> +    return FormatStyle::LK_ObjC;
>>    if (FileName.endswith_lower(".proto") ||
>>        FileName.endswith_lower(".protodevel"))
>>      return FormatStyle::LK_Proto;
>> @@ -1870,12 +1875,21 @@ static FormatStyle::LanguageKind getLang
>>  }
>>
>>  FormatStyle getStyle(StringRef StyleName, StringRef FileName,
>> -                     StringRef FallbackStyle, vfs::FileSystem *FS) {
>> +                     StringRef FallbackStyle, StringRef Code,
>> +                     vfs::FileSystem *FS) {
>>    if (!FS) {
>>      FS = vfs::getRealFileSystem().get();
>>    }
>>    FormatStyle Style = getLLVMStyle();
>>    Style.Language = getLanguageByFileName(FileName);
>> +
>> +  // This is a very crude detection of whether a header contains ObjC
>> code that
>> +  // should be improved over time and probably be done on tokens, not
>> one the
>> +  // bare content of the file.
>> +  if (Style.Language == FormatStyle::LK_Cpp && FileName.endswith(".h") &&
>> +      (Code.contains("\n- (") || Code.contains("\n+ (")))
>> +    Style.Language = FormatStyle::LK_ObjC;
>> +
>>    if (!getPredefinedStyle(FallbackStyle, Style.Language, &Style)) {
>>      llvm::errs() << "Invalid fallback style \"" << FallbackStyle
>>                   << "\" using LLVM style\n";
>>
>> Modified: cfe/trunk/lib/Format/FormatTokenLexer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/For
>> matTokenLexer.cpp?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Format/FormatTokenLexer.cpp (original)
>> +++ cfe/trunk/lib/Format/FormatTokenLexer.cpp Mon Dec 12 06:42:29 2016
>> @@ -558,7 +558,8 @@ FormatToken *FormatTokenLexer::getNextTo
>>      Column = FormatTok->LastLineColumnWidth;
>>    }
>>
>> -  if (Style.Language == FormatStyle::LK_Cpp) {
>> +  if (Style.Language == FormatStyle::LK_Cpp ||
>> +      Style.Language == FormatStyle::LK_ObjC) {
>>      if (!(Tokens.size() > 0 && Tokens.back()->Tok.getIdentifierInfo() &&
>>            Tokens.back()->Tok.getIdentifierInfo()->getPPKeywordID() ==
>>                tok::pp_define) &&
>>
>> Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Tok
>> enAnnotator.cpp?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)
>> +++ cfe/trunk/lib/Format/TokenAnnotator.cpp Mon Dec 12 06:42:29 2016
>> @@ -317,7 +317,8 @@ private:
>>           Contexts.back().InTemplateArgument);
>>
>>      bool StartsObjCMethodExpr =
>> -        !CppArrayTemplates && Style.Language == FormatStyle::LK_Cpp &&
>> +        !CppArrayTemplates && (Style.Language == FormatStyle::LK_Cpp ||
>> +                               Style.Language == FormatStyle::LK_ObjC) &&
>>          Contexts.back().CanBeExpression &&
>> Left->isNot(TT_LambdaLSquare) &&
>>          CurrentToken->isNot(tok::l_brace) &&
>>          (!Parent ||
>> @@ -433,7 +434,8 @@ private:
>>            FormatToken *Previous = CurrentToken->getPreviousNonComment();
>>            if (((CurrentToken->is(tok::colon) &&
>>                  (!Contexts.back().ColonIsDictLiteral ||
>> -                 Style.Language != FormatStyle::LK_Cpp)) ||
>> +                 (Style.Language != FormatStyle::LK_Cpp &&
>> +                  Style.Language != FormatStyle::LK_ObjC))) ||
>>                 Style.Language == FormatStyle::LK_Proto) &&
>>                (Previous->Tok.getIdentifierInfo() ||
>>                 Previous->is(tok::string_literal)))
>> @@ -1174,6 +1176,7 @@ private:
>>    bool rParenEndsCast(const FormatToken &Tok) {
>>      // C-style casts are only used in C++ and Java.
>>      if (Style.Language != FormatStyle::LK_Cpp &&
>> +        Style.Language != FormatStyle::LK_ObjC &&
>>          Style.Language != FormatStyle::LK_Java)
>>        return false;
>>
>>
>> Modified: cfe/trunk/tools/clang-format/ClangFormat.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-fo
>> rmat/ClangFormat.cpp?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/tools/clang-format/ClangFormat.cpp (original)
>> +++ cfe/trunk/tools/clang-format/ClangFormat.cpp Mon Dec 12 06:42:29 2016
>> @@ -249,7 +249,8 @@ static bool format(StringRef FileName) {
>>    if (fillRanges(Code.get(), Ranges))
>>      return true;
>>    StringRef AssumedFileName = (FileName == "-") ? AssumeFileName :
>> FileName;
>> -  FormatStyle FormatStyle = getStyle(Style, AssumedFileName,
>> FallbackStyle);
>> +  FormatStyle FormatStyle =
>> +      getStyle(Style, AssumedFileName, FallbackStyle, Code->getBuffer());
>>    if (SortIncludes.getNumOccurrences() != 0)
>>      FormatStyle.SortIncludes = SortIncludes;
>>    unsigned CursorPosition = Cursor;
>>
>> Modified: cfe/trunk/unittests/Format/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Form
>> at/CMakeLists.txt?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/unittests/Format/CMakeLists.txt (original)
>> +++ cfe/trunk/unittests/Format/CMakeLists.txt Mon Dec 12 06:42:29 2016
>> @@ -7,6 +7,7 @@ add_clang_unittest(FormatTests
>>    FormatTest.cpp
>>    FormatTestJava.cpp
>>    FormatTestJS.cpp
>> +  FormatTestObjC.cpp
>>    FormatTestProto.cpp
>>    FormatTestSelective.cpp
>>    SortImportsTestJS.cpp
>>
>> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Form
>> at/FormatTest.cpp?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
>> +++ cfe/trunk/unittests/Format/FormatTest.cpp Mon Dec 12 06:42:29 2016
>> @@ -2493,42 +2493,6 @@ TEST_F(FormatTest, FormatTryCatchBraceSt
>>                 Style);
>>  }
>>
>> -TEST_F(FormatTest, FormatObjCTryCatch) {
>> -  verifyFormat("@try {\n"
>> -               "  f();\n"
>> -               "} @catch (NSException e) {\n"
>> -               "  @throw;\n"
>> -               "} @finally {\n"
>> -               "  exit(42);\n"
>> -               "}");
>> -  verifyFormat("DEBUG({\n"
>> -               "  @try {\n"
>> -               "  } @finally {\n"
>> -               "  }\n"
>> -               "});\n");
>> -}
>> -
>> -TEST_F(FormatTest, FormatObjCAutoreleasepool) {
>> -  FormatStyle Style = getLLVMStyle();
>> -  verifyFormat("@autoreleasepool {\n"
>> -               "  f();\n"
>> -               "}\n"
>> -               "@autoreleasepool {\n"
>> -               "  f();\n"
>> -               "}\n",
>> -               Style);
>> -  Style.BreakBeforeBraces = FormatStyle::BS_Allman;
>> -  verifyFormat("@autoreleasepool\n"
>> -               "{\n"
>> -               "  f();\n"
>> -               "}\n"
>> -               "@autoreleasepool\n"
>> -               "{\n"
>> -               "  f();\n"
>> -               "}\n",
>> -               Style);
>> -}
>> -
>>  TEST_F(FormatTest, StaticInitializers) {
>>    verifyFormat("static SomeClass SC = {1, 'a'};");
>>
>> @@ -7323,704 +7287,6 @@ TEST_F(FormatTest, FormatForObjectiveCMe
>>    verifyGoogleFormat("- foo:(int)foo;");
>>  }
>>
>> -TEST_F(FormatTest, FormatObjCInterface) {
>> -  verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
>> -               "@public\n"
>> -               "  int field1;\n"
>> -               "@protected\n"
>> -               "  int field2;\n"
>> -               "@private\n"
>> -               "  int field3;\n"
>> -               "@package\n"
>> -               "  int field4;\n"
>> -               "}\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
>> -                     " @public\n"
>> -                     "  int field1;\n"
>> -                     " @protected\n"
>> -                     "  int field2;\n"
>> -                     " @private\n"
>> -                     "  int field3;\n"
>> -                     " @package\n"
>> -                     "  int field4;\n"
>> -                     "}\n"
>> -                     "+ (id)init;\n"
>> -                     "@end");
>> -
>> -  verifyFormat("@interface /* wait for it */ Foo\n"
>> -               "+ (id)init;\n"
>> -               "// Look, a comment!\n"
>> -               "- (int)answerWith:(int)i;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo\n"
>> -               "@end\n"
>> -               "@interface Bar\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo : Bar\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
>> -                     "+ (id)init;\n"
>> -                     "@end");
>> -
>> -  verifyFormat("@interface Foo (HackStuff)\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo ()\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
>> -                     "+ (id)init;\n"
>> -                     "@end");
>> -
>> -  verifyFormat("@interface Foo {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo : Bar {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo (HackStuff) {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo () {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init;\n"
>> -               "@end");
>> -
>> -  FormatStyle OnePerLine = getGoogleStyle();
>> -  OnePerLine.BinPackParameters = false;
>> -  verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
>> -               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> -               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> -               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> -               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
>> -               "}",
>> -               OnePerLine);
>> -}
>> -
>> -TEST_F(FormatTest, FormatObjCImplementation) {
>> -  verifyFormat("@implementation Foo : NSObject {\n"
>> -               "@public\n"
>> -               "  int field1;\n"
>> -               "@protected\n"
>> -               "  int field2;\n"
>> -               "@private\n"
>> -               "  int field3;\n"
>> -               "@package\n"
>> -               "  int field4;\n"
>> -               "}\n"
>> -               "+ (id)init {\n}\n"
>> -               "@end");
>> -
>> -  verifyGoogleFormat("@implementation Foo : NSObject {\n"
>> -                     " @public\n"
>> -                     "  int field1;\n"
>> -                     " @protected\n"
>> -                     "  int field2;\n"
>> -                     " @private\n"
>> -                     "  int field3;\n"
>> -                     " @package\n"
>> -                     "  int field4;\n"
>> -                     "}\n"
>> -                     "+ (id)init {\n}\n"
>> -                     "@end");
>> -
>> -  verifyFormat("@implementation Foo\n"
>> -               "+ (id)init {\n"
>> -               "  if (true)\n"
>> -               "    return nil;\n"
>> -               "}\n"
>> -               "// Look, a comment!\n"
>> -               "- (int)answerWith:(int)i {\n"
>> -               "  return i;\n"
>> -               "}\n"
>> -               "+ (int)answerWith:(int)i {\n"
>> -               "  return i;\n"
>> -               "}\n"
>> -               "@end");
>> -
>> -  verifyFormat("@implementation Foo\n"
>> -               "@end\n"
>> -               "@implementation Bar\n"
>> -               "@end");
>> -
>> -  EXPECT_EQ("@implementation Foo : Bar\n"
>> -            "+ (id)init {\n}\n"
>> -            "- (void)foo {\n}\n"
>> -            "@end",
>> -            format("@implementation Foo : Bar\n"
>> -                   "+(id)init{}\n"
>> -                   "-(void)foo{}\n"
>> -                   "@end"));
>> -
>> -  verifyFormat("@implementation Foo {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init {\n}\n"
>> -               "@end");
>> -
>> -  verifyFormat("@implementation Foo : Bar {\n"
>> -               "  int _i;\n"
>> -               "}\n"
>> -               "+ (id)init {\n}\n"
>> -               "@end");
>> -
>> -  verifyFormat("@implementation Foo (HackStuff)\n"
>> -               "+ (id)init {\n}\n"
>> -               "@end");
>> -  verifyFormat("@implementation ObjcClass\n"
>> -               "- (void)method;\n"
>> -               "{}\n"
>> -               "@end");
>> -}
>> -
>> -TEST_F(FormatTest, FormatObjCProtocol) {
>> -  verifyFormat("@protocol Foo\n"
>> -               "@property(weak) id delegate;\n"
>> -               "- (NSUInteger)numberOfThings;\n"
>> -               "@end");
>> -
>> -  verifyFormat("@protocol MyProtocol <NSObject>\n"
>> -               "- (NSUInteger)numberOfThings;\n"
>> -               "@end");
>> -
>> -  verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
>> -                     "- (NSUInteger)numberOfThings;\n"
>> -                     "@end");
>> -
>> -  verifyFormat("@protocol Foo;\n"
>> -               "@protocol Bar;\n");
>> -
>> -  verifyFormat("@protocol Foo\n"
>> -               "@end\n"
>> -               "@protocol Bar\n"
>> -               "@end");
>> -
>> -  verifyFormat("@protocol myProtocol\n"
>> -               "- (void)mandatoryWithInt:(int)i;\n"
>> -               "@optional\n"
>> -               "- (void)optional;\n"
>> -               "@required\n"
>> -               "- (void)required;\n"
>> -               "@optional\n"
>> -               "@property(assign) int madProp;\n"
>> -               "@end\n");
>> -
>> -  verifyFormat("@property(nonatomic, assign, readonly)\n"
>> -               "    int *looooooooooooooooooooooooooooongNumber;\n"
>> -               "@property(nonatomic, assign, readonly)\n"
>> -               "    NSString *looooooooooooooooooooooooooooongName;");
>> -
>> -  verifyFormat("@implementation PR18406\n"
>> -               "}\n"
>> -               "@end");
>> -}
>> -
>> -TEST_F(FormatTest, FormatObjCMethodDeclarations) {
>> -  verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
>> -               "                   rect:(NSRect)theRect\n"
>> -               "               interval:(float)theInterval {\n"
>> -               "}");
>> -  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> -               "      longKeyword:(NSRect)theRect\n"
>> -               "    longerKeyword:(float)theInterval\n"
>> -               "            error:(NSError **)theError {\n"
>> -               "}");
>> -  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> -               "          longKeyword:(NSRect)theRect\n"
>> -               "    evenLongerKeyword:(float)theInterval\n"
>> -               "                error:(NSError **)theError {\n"
>> -               "}");
>> -  verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
>> -               "                         y:(id<yyyyyyyyyyyyyyyyyyyy>)
>> y\n"
>> -               "    NS_DESIGNATED_INITIALIZER;",
>> -               getLLVMStyleWithColumns(60));
>> -
>> -  // Continuation indent width should win over aligning colons if the
>> function
>> -  // name is long.
>> -  FormatStyle continuationStyle = getGoogleStyle();
>> -  continuationStyle.ColumnLimit = 40;
>> -  continuationStyle.IndentWrappedFunctionNames = true;
>> -  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> -               "    dontAlignNamef:(NSRect)theRect {\n"
>> -               "}",
>> -               continuationStyle);
>> -
>> -  // Make sure we don't break aligning for short parameter names.
>> -  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> -               "       aShortf:(NSRect)theRect {\n"
>> -               "}",
>> -               continuationStyle);
>> -
>> -  // Format pairs correctly.
>> -  verifyFormat("- (void)drawRectOn:(id)surface\n"
>> -               "            ofSize:(aaaaaaaa)height\n"
>> -               "                  :(size_t)width\n"
>> -               "          atOrigin:(size_t)x\n"
>> -               "                  :(size_t)y\n"
>> -               "             aaaaa:(a)yyy\n"
>> -               "               bbb:(d)cccc;");
>> -  verifyFormat("- (void)drawRectOn:(id)surface
>> ofSize:(aaa)height:(bbb)width;");
>> -  verifyFormat("- (void)drawRectOn:(id)surface\n"
>> -               "            ofSize:(size_t)height\n"
>> -               "                  :(size_t)width;",
>> -               getLLVMStyleWithColumns(60));
>> -}
>> -
>> -TEST_F(FormatTest, FormatObjCMethodExpr) {
>> -  verifyFormat("[foo bar:baz];");
>> -  verifyFormat("return [foo bar:baz];");
>> -  verifyFormat("return (a)[foo bar:baz];");
>> -  verifyFormat("f([foo bar:baz]);");
>> -  verifyFormat("f(2, [foo bar:baz]);");
>> -  verifyFormat("f(2, a ? b : c);");
>> -  verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
>> -
>> -  // Unary operators.
>> -  verifyFormat("int a = +[foo bar:baz];");
>> -  verifyFormat("int a = -[foo bar:baz];");
>> -  verifyFormat("int a = ![foo bar:baz];");
>> -  verifyFormat("int a = ~[foo bar:baz];");
>> -  verifyFormat("int a = ++[foo bar:baz];");
>> -  verifyFormat("int a = --[foo bar:baz];");
>> -  verifyFormat("int a = sizeof [foo bar:baz];");
>> -  verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
>> -  verifyFormat("int a = &[foo bar:baz];");
>> -  verifyFormat("int a = *[foo bar:baz];");
>> -  // FIXME: Make casts work, without breaking f()[4].
>> -  // verifyFormat("int a = (int)[foo bar:baz];");
>> -  // verifyFormat("return (int)[foo bar:baz];");
>> -  // verifyFormat("(void)[foo bar:baz];");
>> -  verifyFormat("return (MyType *)[self.tableView
>> cellForRowAtIndexPath:cell];");
>> -
>> -  // Binary operators.
>> -  verifyFormat("[foo bar:baz], [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] = [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] *= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] /= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] %= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] += [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] -= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] &= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] |= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] || [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] && [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] | [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] & [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] == [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] != [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] >= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] <= [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] > [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] < [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] >> [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] << [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] - [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] + [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] * [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] / [foo bar:baz];");
>> -  verifyFormat("[foo bar:baz] % [foo bar:baz];");
>> -  // Whew!
>> -
>> -  verifyFormat("return in[42];");
>> -  verifyFormat("for (auto v : in[1]) {\n}");
>> -  verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
>> -  verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
>> -  verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
>> -  verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
>> -  verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
>> -  verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
>> -               "}");
>> -  verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
>> -  verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
>> -  verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
>> -
>> -  verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
>> -  verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
>> -  verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
>> -  verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
>> -  verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
>> -  verifyFormat("[button setAction:@selector(zoomOut:)];");
>> -  verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
>> -
>> -  verifyFormat("arr[[self indexForFoo:a]];");
>> -  verifyFormat("throw [self errorFor:a];");
>> -  verifyFormat("@throw [self errorFor:a];");
>> -
>> -  verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
>> -  verifyFormat("[(id)foo bar:(id) ? baz : quux];");
>> -  verifyFormat("4 > 4 ? (id)a : (id)baz;");
>> -
>> -  // This tests that the formatter doesn't break after "backing" but
>> before ":",
>> -  // which would be at 80 columns.
>> -  verifyFormat(
>> -      "void f() {\n"
>> -      "  if ((self = [super initWithContentRect:contentRect\n"
>> -      "                               styleMask:styleMask ?: otherMask\n"
>> -      "                                 backing:NSBackingStoreBuffere
>> d\n"
>> -      "                                   defer:YES]))");
>> -
>> -  verifyFormat(
>> -      "[foo checkThatBreakingAfterColonWorksOk:\n"
>> -      "         [bar ifItDoes:reduceOverallLineLeng
>> thLikeInThisCase]];");
>> -
>> -  verifyFormat("[myObj short:arg1 // Force line break\n"
>> -               "          longKeyword:arg2 != nil ? arg2 :
>> @\"longKeyword\"\n"
>> -               "    evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
>> -               "                error:arg4];");
>> -  verifyFormat(
>> -      "void f() {\n"
>> -      "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
>> -      "      initWithContentRect:NSMakeRect(origin_global.x,
>> origin_global.y,\n"
>> -      "                                     pos.width(), pos.height())\n"
>> -      "                styleMask:NSBorderlessWindowMask\n"
>> -      "                  backing:NSBackingStoreBuffered\n"
>> -      "                    defer:NO]);\n"
>> -      "}");
>> -  verifyFormat(
>> -      "void f() {\n"
>> -      "  popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
>> -      "      iniithContentRect:NSMakRet(origin_global.x,
>> origin_global.y,\n"
>> -      "                                 pos.width(), pos.height())\n"
>> -      "                syeMask:NSBorderlessWindowMask\n"
>> -      "                  bking:NSBackingStoreBuffered\n"
>> -      "                    der:NO]);\n"
>> -      "}",
>> -      getLLVMStyleWithColumns(70));
>> -  verifyFormat(
>> -      "void f() {\n"
>> -      "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
>> -      "      initWithContentRect:NSMakeRect(origin_global.x,
>> origin_global.y,\n"
>> -      "                                     pos.width(), pos.height())\n"
>> -      "                styleMask:NSBorderlessWindowMask\n"
>> -      "                  backing:NSBackingStoreBuffered\n"
>> -      "                    defer:NO]);\n"
>> -      "}",
>> -      getChromiumStyle(FormatStyle::LK_Cpp));
>> -  verifyFormat("[contentsContainer replaceSubview:[subviews
>> objectAtIndex:0]\n"
>> -               "                             with:contentsNativeView];");
>> -
>> -  verifyFormat(
>> -      "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButto
>> nDragType]\n"
>> -      "           owner:nillllll];");
>> -
>> -  verifyFormat(
>> -      "[pboard setData:[NSData dataWithBytes:&button
>> length:sizeof(button)]\n"
>> -      "        forType:kBookmarkButtonDragType];");
>> -
>> -  verifyFormat("[defaultCenter addObserver:self\n"
>> -               "                  selector:@selector(willEnterFu
>> llscreen)\n"
>> -               "                      name:kWillEnterFullscreenNotif
>> ication\n"
>> -               "                    object:nil];");
>> -  verifyFormat("[image_rep drawInRect:drawRect\n"
>> -               "             fromRect:NSZeroRect\n"
>> -               "            operation:NSCompositeCopy\n"
>> -               "             fraction:1.0\n"
>> -               "       respectFlipped:NO\n"
>> -               "                hints:nil];");
>> -  verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
>> -               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
>> -  verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
>> -               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
>> -  verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaa
>> aaaaaaaaa]\n"
>> -               "    aaaaaaaaaaaaaaaaaaaaaa];");
>> -  verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaa
>> aaa.aaaaaaaa.aaaaaaaa\n"
>> -               "        .aaaaaaaa];", // FIXME: Indentation seems off.
>> -               getLLVMStyleWithColumns(60));
>> -
>> -  verifyFormat(
>> -      "scoped_nsobject<NSTextField> message(\n"
>> -      "    // The frame will be fixed up when |-setMessageText:| is
>> called.\n"
>> -      "    [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0,
>> 0)]);");
>> -  verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
>> -               "    aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
>> -               "         aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
>> -               "          aaaa:bbb];");
>> -  verifyFormat("[self param:function( //\n"
>> -               "                parameter)]");
>> -  verifyFormat(
>> -      "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |
>> aaaaaaaaaaaaaaa |\n"
>> -      "                 aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |
>> aaaaaaaaaaaaaaa |\n"
>> -      "                 aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
>> -
>> -  // FIXME: This violates the column limit.
>> -  verifyFormat(
>> -      "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
>> -      "    aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
>> -      "                  aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa
>> aaaaaaaaaaaaaaa];",
>> -      getLLVMStyleWithColumns(60));
>> -
>> -  // Variadic parameters.
>> -  verifyFormat(
>> -      "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\",
>> nil];");
>> -  verifyFormat(
>> -      "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,
>> aaaaaaaaaaaaaaa,\n"
>> -      "                    aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,
>> aaaaaaaaaaaaaaa,\n"
>> -      "                    aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
>> -  verifyFormat("[self // break\n"
>> -               "      a:a\n"
>> -               "    aaa:aaa];");
>> -  verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
>> -               "          [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
>> -
>> -  // Formats pair-parameters.
>> -  verifyFormat("[I drawRectOn:surface ofSize:aa:bbb atOrigin:cc:dd];");
>> -  verifyFormat("[I drawRectOn:surface //\n"
>> -               "        ofSize:aa:bbb\n"
>> -               "      atOrigin:cc:dd];");
>> -}
>> -
>> -TEST_F(FormatTest, ObjCAt) {
>> -  verifyFormat("@autoreleasepool");
>> -  verifyFormat("@catch");
>> -  verifyFormat("@class");
>> -  verifyFormat("@compatibility_alias");
>> -  verifyFormat("@defs");
>> -  verifyFormat("@dynamic");
>> -  verifyFormat("@encode");
>> -  verifyFormat("@end");
>> -  verifyFormat("@finally");
>> -  verifyFormat("@implementation");
>> -  verifyFormat("@import");
>> -  verifyFormat("@interface");
>> -  verifyFormat("@optional");
>> -  verifyFormat("@package");
>> -  verifyFormat("@private");
>> -  verifyFormat("@property");
>> -  verifyFormat("@protected");
>> -  verifyFormat("@protocol");
>> -  verifyFormat("@public");
>> -  verifyFormat("@required");
>> -  verifyFormat("@selector");
>> -  verifyFormat("@synchronized");
>> -  verifyFormat("@synthesize");
>> -  verifyFormat("@throw");
>> -  verifyFormat("@try");
>> -
>> -  EXPECT_EQ("@interface", format("@ interface"));
>> -
>> -  // The precise formatting of this doesn't matter, nobody writes code
>> like
>> -  // this.
>> -  verifyFormat("@ /*foo*/ interface");
>> -}
>> -
>> -TEST_F(FormatTest, ObjCSnippets) {
>> -  verifyFormat("@autoreleasepool {\n"
>> -               "  foo();\n"
>> -               "}");
>> -  verifyFormat("@class Foo, Bar;");
>> -  verifyFormat("@compatibility_alias AliasName ExistingClass;");
>> -  verifyFormat("@dynamic textColor;");
>> -  verifyFormat("char *buf1 = @encode(int *);");
>> -  verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
>> -  verifyFormat("char *buf1 = @encode(int **);");
>> -  verifyFormat("Protocol *proto = @protocol(p1);");
>> -  verifyFormat("SEL s = @selector(foo:);");
>> -  verifyFormat("@synchronized(self) {\n"
>> -               "  f();\n"
>> -               "}");
>> -
>> -  verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
>> -  verifyGoogleFormat("@synthesize dropArrowPosition =
>> dropArrowPosition_;");
>> -
>> -  verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
>> -  verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
>> -  verifyGoogleFormat("@property(assign, getter=isEditable) BOOL
>> editable;");
>> -  verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
>> -               getMozillaStyle());
>> -  verifyFormat("@property BOOL editable;", getMozillaStyle());
>> -  verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
>> -               getWebKitStyle());
>> -  verifyFormat("@property BOOL editable;", getWebKitStyle());
>> -
>> -  verifyFormat("@import foo.bar;\n"
>> -               "@import baz;");
>> -}
>> -
>> -TEST_F(FormatTest, ObjCForIn) {
>> -  verifyFormat("- (void)test {\n"
>> -               "  for (NSString *n in arrayOfStrings) {\n"
>> -               "    foo(n);\n"
>> -               "  }\n"
>> -               "}");
>> -  verifyFormat("- (void)test {\n"
>> -               "  for (NSString *n in (__bridge NSArray
>> *)arrayOfStrings) {\n"
>> -               "    foo(n);\n"
>> -               "  }\n"
>> -               "}");
>> -}
>> -
>> -TEST_F(FormatTest, ObjCLiterals) {
>> -  verifyFormat("@\"String\"");
>> -  verifyFormat("@1");
>> -  verifyFormat("@+4.8");
>> -  verifyFormat("@-4");
>> -  verifyFormat("@1LL");
>> -  verifyFormat("@.5");
>> -  verifyFormat("@'c'");
>> -  verifyFormat("@true");
>> -
>> -  verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
>> -  verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
>> -  verifyFormat("NSNumber *favoriteColor = @(Green);");
>> -  verifyFormat("NSString *path = @(getenv(\"PATH\"));");
>> -
>> -  verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
>> -}
>> -
>> -TEST_F(FormatTest, ObjCDictLiterals) {
>> -  verifyFormat("@{");
>> -  verifyFormat("@{}");
>> -  verifyFormat("@{@\"one\" : @1}");
>> -  verifyFormat("return @{@\"one\" : @1;");
>> -  verifyFormat("@{@\"one\" : @1}");
>> -
>> -  verifyFormat("@{@\"one\" : @{@2 : @1}}");
>> -  verifyFormat("@{\n"
>> -               "  @\"one\" : @{@2 : @1},\n"
>> -               "}");
>> -
>> -  verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
>> -  verifyIncompleteFormat("[self setDict:@{}");
>> -  verifyIncompleteFormat("[self setDict:@{@1 : @2}");
>> -  verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
>> -  verifyFormat(
>> -      "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
>> -  verifyFormat(
>> -      "NSDictionary *settings = @{AVEncoderKey :
>> @(AVAudioQualityMax)};");
>> -
>> -  verifyFormat("NSDictionary *d = @{\n"
>> -               "  @\"nam\" : NSUserNam(),\n"
>> -               "  @\"dte\" : [NSDate date],\n"
>> -               "  @\"processInfo\" : [NSProcessInfo processInfo]\n"
>> -               "};");
>> -  verifyFormat(
>> -      "@{\n"
>> -      "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
>> : "
>> -      "regularFont,\n"
>> -      "};");
>> -  verifyGoogleFormat(
>> -      "@{\n"
>> -      "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
>> : "
>> -      "regularFont,\n"
>> -      "};");
>> -  verifyFormat(
>> -      "@{\n"
>> -      "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
>> :\n"
>> -      "      reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
>> -      "};");
>> -
>> -  // We should try to be robust in case someone forgets the "@".
>> -  verifyFormat("NSDictionary *d = {\n"
>> -               "  @\"nam\" : NSUserNam(),\n"
>> -               "  @\"dte\" : [NSDate date],\n"
>> -               "  @\"processInfo\" : [NSProcessInfo processInfo]\n"
>> -               "};");
>> -  verifyFormat("NSMutableDictionary *dictionary =\n"
>> -               "    [NSMutableDictionary dictionaryWithDictionary:@{\n"
>> -               "      aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
>> -               "      bbbbbbbbbbbbbbbbbb : bbbbb,\n"
>> -               "      cccccccccccccccc : ccccccccccccccc\n"
>> -               "    }];");
>> -
>> -  // Ensure that casts before the key are kept on the same line as the
>> key.
>> -  verifyFormat(
>> -      "NSDictionary *d = @{\n"
>> -      "  (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa
>> id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> -      "  (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
>> -      "};");
>> -}
>> -
>> -TEST_F(FormatTest, ObjCArrayLiterals) {
>> -  verifyIncompleteFormat("@[");
>> -  verifyFormat("@[]");
>> -  verifyFormat(
>> -      "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber
>> numberWithInt:42] ];");
>> -  verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
>> -  verifyFormat("NSArray *array = @[ [foo description] ];");
>> -
>> -  verifyFormat(
>> -      "NSArray *some_variable = @[\n"
>> -      "  aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" :
>> @\"aaaaaaaaaaaaaa\",\n"
>> -      "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -      "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -      "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -      "];");
>> -  verifyFormat(
>> -      "NSArray *some_variable = @[\n"
>> -      "  aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" :
>> @\"aaaaaaaaaaaaaa\",\n"
>> -      "  @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\",
>> @\"aaaaaaaaaaaaaaaa\"\n"
>> -      "];");
>> -  verifyFormat("NSArray *some_variable = @[\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "];");
>> -  verifyFormat("NSArray *array = @[\n"
>> -               "  @\"a\",\n"
>> -               "  @\"a\",\n" // Trailing comma -> one per line.
>> -               "];");
>> -
>> -  // We should try to be robust in case someone forgets the "@".
>> -  verifyFormat("NSArray *some_variable = [\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> -               "];");
>> -  verifyFormat(
>> -      "- (NSAttributedString *)attributedStringForSegment:(
>> NSUInteger)segment\n"
>> -      "
>>  index:(NSUInteger)index\n"
>> -      "                                nonDigitAttributes:\n"
>> -      "                                    (NSDictionary
>> *)noDigitAttributes;");
>> -  verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
>> -               "  NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
>> -               "]];");
>> -}
>>
>>  TEST_F(FormatTest, BreaksStringLiterals) {
>>    EXPECT_EQ("\"some text \"\n"
>> @@ -11630,13 +10896,13 @@ TEST(FormatStyle, GetStyleOfFile) {
>>                   llvm::MemoryBuffer::getMemBuffer("BasedOnStyle:
>> LLVM")));
>>    ASSERT_TRUE(
>>        FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int
>> i;")));
>> -  auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS);
>> +  auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
>>    ASSERT_EQ(Style1, getLLVMStyle());
>>
>>    // Test 2: fallback to default.
>>    ASSERT_TRUE(
>>        FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int
>> i;")));
>> -  auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS);
>> +  auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
>>    ASSERT_EQ(Style2, getMozillaStyle());
>>
>>    // Test 3: format file in parent directory.
>> @@ -11645,7 +10911,7 @@ TEST(FormatStyle, GetStyleOfFile) {
>>                   llvm::MemoryBuffer::getMemBuffer("BasedOnStyle:
>> Google")));
>>    ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
>>                           llvm::MemoryBuffer::getMemBuffer("int i;")));
>> -  auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS);
>> +  auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "",
>> &FS);
>>    ASSERT_EQ(Style3, getGoogleStyle());
>>  }
>>
>>
>> Added: cfe/trunk/unittests/Format/FormatTestObjC.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Form
>> at/FormatTestObjC.cpp?rev=289428&view=auto
>> ============================================================
>> ==================
>> --- cfe/trunk/unittests/Format/FormatTestObjC.cpp (added)
>> +++ cfe/trunk/unittests/Format/FormatTestObjC.cpp Mon Dec 12 06:42:29
>> 2016
>> @@ -0,0 +1,822 @@
>> +//===- unittest/Format/FormatTestObjC.cpp - Formatting unit
>> tests----------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===------------------------------------------------------
>> ----------------===//
>> +
>> +#include "clang/Format/Format.h"
>> +
>> +#include "../Tooling/ReplacementTest.h"
>> +#include "FormatTestUtils.h"
>> +
>> +#include "clang/Frontend/TextDiagnosticPrinter.h"
>> +#include "llvm/Support/Debug.h"
>> +#include "llvm/Support/MemoryBuffer.h"
>> +#include "gtest/gtest.h"
>> +
>> +#define DEBUG_TYPE "format-test"
>> +
>> +using clang::tooling::ReplacementTest;
>> +using clang::tooling::toReplacements;
>> +
>> +namespace clang {
>> +namespace format {
>> +namespace {
>> +
>> +class FormatTestObjC : public ::testing::Test {
>> +protected:
>> +  FormatTestObjC() {
>> +    Style = getLLVMStyle();
>> +    Style.Language = FormatStyle::LK_ObjC;
>> +  }
>> +
>> +  enum IncompleteCheck {
>> +    IC_ExpectComplete,
>> +    IC_ExpectIncomplete,
>> +    IC_DoNotCheck
>> +  };
>> +
>> +  std::string format(llvm::StringRef Code,
>> +                     IncompleteCheck CheckIncomplete =
>> IC_ExpectComplete) {
>> +    DEBUG(llvm::errs() << "---\n");
>> +    DEBUG(llvm::errs() << Code << "\n\n");
>> +    std::vector<tooling::Range> Ranges(1, tooling::Range(0,
>> Code.size()));
>> +    bool IncompleteFormat = false;
>> +    tooling::Replacements Replaces =
>> +        reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
>> +    if (CheckIncomplete != IC_DoNotCheck) {
>> +      bool ExpectedIncompleteFormat = CheckIncomplete ==
>> IC_ExpectIncomplete;
>> +      EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code <<
>> "\n\n";
>> +    }
>> +    auto Result = applyAllReplacements(Code, Replaces);
>> +    EXPECT_TRUE(static_cast<bool>(Result));
>> +    DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
>> +    return *Result;
>> +  }
>> +
>> +  void verifyFormat(StringRef Code) {
>> +    EXPECT_EQ(Code.str(), format(test::messUp(Code)));
>> +  }
>> +
>> +  void verifyIncompleteFormat(StringRef Code) {
>> +    EXPECT_EQ(Code.str(), format(test::messUp(Code),
>> IC_ExpectIncomplete));
>> +  }
>> +
>> +  FormatStyle Style;
>> +};
>> +
>> +TEST_F(FormatTestObjC, DetectsObjCInHeaders) {
>> +  Style = getStyle("LLVM", "a.h", "none", "@interface\n"
>> +                                          "- (id)init;");
>> +  EXPECT_EQ(FormatStyle::LK_ObjC, Style.Language);
>> +  Style = getStyle("LLVM", "a.h", "none", "@interface\n"
>> +                                          "+ (id)init;");
>> +  EXPECT_EQ(FormatStyle::LK_ObjC, Style.Language);
>> +
>> +  // No recognizable ObjC.
>> +  Style = getStyle("LLVM", "a.h", "none", "void f() {}");
>> +  EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
>> +}
>> +
>> +TEST_F(FormatTestObjC, FormatObjCTryCatch) {
>> +  verifyFormat("@try {\n"
>> +               "  f();\n"
>> +               "} @catch (NSException e) {\n"
>> +               "  @throw;\n"
>> +               "} @finally {\n"
>> +               "  exit(42);\n"
>> +               "}");
>> +  verifyFormat("DEBUG({\n"
>> +               "  @try {\n"
>> +               "  } @finally {\n"
>> +               "  }\n"
>> +               "});\n");
>> +}
>> +
>> +TEST_F(FormatTestObjC, FormatObjCAutoreleasepool) {
>> +  verifyFormat("@autoreleasepool {\n"
>> +               "  f();\n"
>> +               "}\n"
>> +               "@autoreleasepool {\n"
>> +               "  f();\n"
>> +               "}\n");
>> +  Style.BreakBeforeBraces = FormatStyle::BS_Allman;
>> +  verifyFormat("@autoreleasepool\n"
>> +               "{\n"
>> +               "  f();\n"
>> +               "}\n"
>> +               "@autoreleasepool\n"
>> +               "{\n"
>> +               "  f();\n"
>> +               "}\n");
>> +}
>> +
>> +TEST_F(FormatTestObjC, FormatObjCInterface) {
>> +  verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
>> +               "@public\n"
>> +               "  int field1;\n"
>> +               "@protected\n"
>> +               "  int field2;\n"
>> +               "@private\n"
>> +               "  int field3;\n"
>> +               "@package\n"
>> +               "  int field4;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface /* wait for it */ Foo\n"
>> +               "+ (id)init;\n"
>> +               "// Look, a comment!\n"
>> +               "- (int)answerWith:(int)i;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo\n"
>> +               "@end\n"
>> +               "@interface Bar\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo : Bar\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo (HackStuff)\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo ()\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo : Bar {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo (HackStuff) {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo () {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +
>> +  Style = getGoogleStyle(FormatStyle::LK_ObjC);
>> +  verifyFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
>> +               " @public\n"
>> +               "  int field1;\n"
>> +               " @protected\n"
>> +               "  int field2;\n"
>> +               " @private\n"
>> +               "  int field3;\n"
>> +               " @package\n"
>> +               "  int field4;\n"
>> +               "}\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +  verifyFormat("@interface Foo : Bar<Baz, Quux>\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +  verifyFormat("@interface Foo (HackStuff)<MyProtocol>\n"
>> +               "+ (id)init;\n"
>> +               "@end");
>> +  Style.BinPackParameters = false;
>> +  Style.ColumnLimit = 80;
>> +  verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
>> +               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> +               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> +               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> +               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
>> +               "}");
>> +}
>> +
>> +TEST_F(FormatTestObjC, FormatObjCImplementation) {
>> +  verifyFormat("@implementation Foo : NSObject {\n"
>> +               "@public\n"
>> +               "  int field1;\n"
>> +               "@protected\n"
>> +               "  int field2;\n"
>> +               "@private\n"
>> +               "  int field3;\n"
>> +               "@package\n"
>> +               "  int field4;\n"
>> +               "}\n"
>> +               "+ (id)init {\n}\n"
>> +               "@end");
>> +
>> +  verifyFormat("@implementation Foo\n"
>> +               "+ (id)init {\n"
>> +               "  if (true)\n"
>> +               "    return nil;\n"
>> +               "}\n"
>> +               "// Look, a comment!\n"
>> +               "- (int)answerWith:(int)i {\n"
>> +               "  return i;\n"
>> +               "}\n"
>> +               "+ (int)answerWith:(int)i {\n"
>> +               "  return i;\n"
>> +               "}\n"
>> +               "@end");
>> +
>> +  verifyFormat("@implementation Foo\n"
>> +               "@end\n"
>> +               "@implementation Bar\n"
>> +               "@end");
>> +
>> +  EXPECT_EQ("@implementation Foo : Bar\n"
>> +            "+ (id)init {\n}\n"
>> +            "- (void)foo {\n}\n"
>> +            "@end",
>> +            format("@implementation Foo : Bar\n"
>> +                   "+(id)init{}\n"
>> +                   "-(void)foo{}\n"
>> +                   "@end"));
>> +
>> +  verifyFormat("@implementation Foo {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init {\n}\n"
>> +               "@end");
>> +
>> +  verifyFormat("@implementation Foo : Bar {\n"
>> +               "  int _i;\n"
>> +               "}\n"
>> +               "+ (id)init {\n}\n"
>> +               "@end");
>> +
>> +  verifyFormat("@implementation Foo (HackStuff)\n"
>> +               "+ (id)init {\n}\n"
>> +               "@end");
>> +  verifyFormat("@implementation ObjcClass\n"
>> +               "- (void)method;\n"
>> +               "{}\n"
>> +               "@end");
>> +
>> +  Style = getGoogleStyle(FormatStyle::LK_ObjC);
>> +  verifyFormat("@implementation Foo : NSObject {\n"
>> +               " @public\n"
>> +               "  int field1;\n"
>> +               " @protected\n"
>> +               "  int field2;\n"
>> +               " @private\n"
>> +               "  int field3;\n"
>> +               " @package\n"
>> +               "  int field4;\n"
>> +               "}\n"
>> +               "+ (id)init {\n}\n"
>> +               "@end");
>> +}
>> +
>> +TEST_F(FormatTestObjC, FormatObjCProtocol) {
>> +  verifyFormat("@protocol Foo\n"
>> +               "@property(weak) id delegate;\n"
>> +               "- (NSUInteger)numberOfThings;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@protocol MyProtocol <NSObject>\n"
>> +               "- (NSUInteger)numberOfThings;\n"
>> +               "@end");
>> +
>> +  verifyFormat("@protocol Foo;\n"
>> +               "@protocol Bar;\n");
>> +
>> +  verifyFormat("@protocol Foo\n"
>> +               "@end\n"
>> +               "@protocol Bar\n"
>> +               "@end");
>> +
>> +  verifyFormat("@protocol myProtocol\n"
>> +               "- (void)mandatoryWithInt:(int)i;\n"
>> +               "@optional\n"
>> +               "- (void)optional;\n"
>> +               "@required\n"
>> +               "- (void)required;\n"
>> +               "@optional\n"
>> +               "@property(assign) int madProp;\n"
>> +               "@end\n");
>> +
>> +  verifyFormat("@property(nonatomic, assign, readonly)\n"
>> +               "    int *looooooooooooooooooooooooooooongNumber;\n"
>> +               "@property(nonatomic, assign, readonly)\n"
>> +               "    NSString *looooooooooooooooooooooooooooongName;");
>> +
>> +  verifyFormat("@implementation PR18406\n"
>> +               "}\n"
>> +               "@end");
>> +
>> +  Style = getGoogleStyle(FormatStyle::LK_ObjC);
>> +  verifyFormat("@protocol MyProtocol<NSObject>\n"
>> +               "- (NSUInteger)numberOfThings;\n"
>> +               "@end");
>> +}
>> +
>> +TEST_F(FormatTestObjC, FormatObjCMethodDeclarations) {
>> +  verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
>> +               "                   rect:(NSRect)theRect\n"
>> +               "               interval:(float)theInterval {\n"
>> +               "}");
>> +  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> +               "      longKeyword:(NSRect)theRect\n"
>> +               "    longerKeyword:(float)theInterval\n"
>> +               "            error:(NSError **)theError {\n"
>> +               "}");
>> +  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> +               "          longKeyword:(NSRect)theRect\n"
>> +               "    evenLongerKeyword:(float)theInterval\n"
>> +               "                error:(NSError **)theError {\n"
>> +               "}");
>> +  Style.ColumnLimit = 60;
>> +  verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
>> +               "                         y:(id<yyyyyyyyyyyyyyyyyyyy>)
>> y\n"
>> +               "    NS_DESIGNATED_INITIALIZER;");
>> +  verifyFormat("- (void)drawRectOn:(id)surface\n"
>> +               "            ofSize:(size_t)height\n"
>> +               "                  :(size_t)width;");
>> +
>> +  // Continuation indent width should win over aligning colons if the
>> function
>> +  // name is long.
>> +  Style = getGoogleStyle(FormatStyle::LK_ObjC);
>> +  Style.ColumnLimit = 40;
>> +  Style.IndentWrappedFunctionNames = true;
>> +  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> +               "    dontAlignNamef:(NSRect)theRect {\n"
>> +               "}");
>> +
>> +  // Make sure we don't break aligning for short parameter names.
>> +  verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
>> +               "       aShortf:(NSRect)theRect {\n"
>> +               "}");
>> +
>> +  // Format pairs correctly.
>> +  Style.ColumnLimit = 80;
>> +  verifyFormat("- (void)drawRectOn:(id)surface\n"
>> +               "            ofSize:(aaaaaaaa)height\n"
>> +               "                  :(size_t)width\n"
>> +               "          atOrigin:(size_t)x\n"
>> +               "                  :(size_t)y\n"
>> +               "             aaaaa:(a)yyy\n"
>> +               "               bbb:(d)cccc;");
>> +  verifyFormat("- (void)drawRectOn:(id)surface
>> ofSize:(aaa)height:(bbb)width;");
>> +}
>> +
>> +TEST_F(FormatTestObjC, FormatObjCMethodExpr) {
>> +  verifyFormat("[foo bar:baz];");
>> +  verifyFormat("return [foo bar:baz];");
>> +  verifyFormat("return (a)[foo bar:baz];");
>> +  verifyFormat("f([foo bar:baz]);");
>> +  verifyFormat("f(2, [foo bar:baz]);");
>> +  verifyFormat("f(2, a ? b : c);");
>> +  verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
>> +
>> +  // Unary operators.
>> +  verifyFormat("int a = +[foo bar:baz];");
>> +  verifyFormat("int a = -[foo bar:baz];");
>> +  verifyFormat("int a = ![foo bar:baz];");
>> +  verifyFormat("int a = ~[foo bar:baz];");
>> +  verifyFormat("int a = ++[foo bar:baz];");
>> +  verifyFormat("int a = --[foo bar:baz];");
>> +  verifyFormat("int a = sizeof [foo bar:baz];");
>> +  verifyFormat("int a = alignof [foo bar:baz];");
>> +  verifyFormat("int a = &[foo bar:baz];");
>> +  verifyFormat("int a = *[foo bar:baz];");
>> +  // FIXME: Make casts work, without breaking f()[4].
>> +  // verifyFormat("int a = (int)[foo bar:baz];");
>> +  // verifyFormat("return (int)[foo bar:baz];");
>> +  // verifyFormat("(void)[foo bar:baz];");
>> +  verifyFormat("return (MyType *)[self.tableView
>> cellForRowAtIndexPath:cell];");
>> +
>> +  // Binary operators.
>> +  verifyFormat("[foo bar:baz], [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] = [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] *= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] /= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] %= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] += [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] -= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] &= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] |= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] || [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] && [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] | [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] & [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] == [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] != [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] >= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] <= [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] > [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] < [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] >> [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] << [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] - [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] + [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] * [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] / [foo bar:baz];");
>> +  verifyFormat("[foo bar:baz] % [foo bar:baz];");
>> +  // Whew!
>> +
>> +  verifyFormat("return in[42];");
>> +  verifyFormat("for (auto v : in[1]) {\n}");
>> +  verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
>> +  verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
>> +  verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
>> +  verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
>> +  verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
>> +  verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
>> +               "}");
>> +  verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
>> +  verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
>> +  verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
>> +
>> +  verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
>> +  verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
>> +  verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
>> +  verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
>> +  verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
>> +  verifyFormat("[button setAction:@selector(zoomOut:)];");
>> +  verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
>> +
>> +  verifyFormat("arr[[self indexForFoo:a]];");
>> +  verifyFormat("throw [self errorFor:a];");
>> +  verifyFormat("@throw [self errorFor:a];");
>> +
>> +  verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
>> +  verifyFormat("[(id)foo bar:(id) ? baz : quux];");
>> +  verifyFormat("4 > 4 ? (id)a : (id)baz;");
>> +
>> +  // This tests that the formatter doesn't break after "backing" but
>> before ":",
>> +  // which would be at 80 columns.
>> +  verifyFormat(
>> +      "void f() {\n"
>> +      "  if ((self = [super initWithContentRect:contentRect\n"
>> +      "                               styleMask:styleMask ?: otherMask\n"
>> +      "                                 backing:NSBackingStoreBuffere
>> d\n"
>> +      "                                   defer:YES]))");
>> +
>> +  verifyFormat(
>> +      "[foo checkThatBreakingAfterColonWorksOk:\n"
>> +      "         [bar ifItDoes:reduceOverallLineLeng
>> thLikeInThisCase]];");
>> +
>> +  verifyFormat("[myObj short:arg1 // Force line break\n"
>> +               "          longKeyword:arg2 != nil ? arg2 :
>> @\"longKeyword\"\n"
>> +               "    evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
>> +               "                error:arg4];");
>> +  verifyFormat(
>> +      "void f() {\n"
>> +      "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
>> +      "      initWithContentRect:NSMakeRect(origin_global.x,
>> origin_global.y,\n"
>> +      "                                     pos.width(), pos.height())\n"
>> +      "                styleMask:NSBorderlessWindowMask\n"
>> +      "                  backing:NSBackingStoreBuffered\n"
>> +      "                    defer:NO]);\n"
>> +      "}");
>> +  verifyFormat("[contentsContainer replaceSubview:[subviews
>> objectAtIndex:0]\n"
>> +               "                             with:contentsNativeView];");
>> +
>> +  verifyFormat(
>> +      "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButto
>> nDragType]\n"
>> +      "           owner:nillllll];");
>> +
>> +  verifyFormat(
>> +      "[pboard setData:[NSData dataWithBytes:&button
>> length:sizeof(button)]\n"
>> +      "        forType:kBookmarkButtonDragType];");
>> +
>> +  verifyFormat("[defaultCenter addObserver:self\n"
>> +               "                  selector:@selector(willEnterFu
>> llscreen)\n"
>> +               "                      name:kWillEnterFullscreenNotif
>> ication\n"
>> +               "                    object:nil];");
>> +  verifyFormat("[image_rep drawInRect:drawRect\n"
>> +               "             fromRect:NSZeroRect\n"
>> +               "            operation:NSCompositeCopy\n"
>> +               "             fraction:1.0\n"
>> +               "       respectFlipped:NO\n"
>> +               "                hints:nil];");
>> +  verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
>> +               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
>> +  verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
>> +               "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
>> +  verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaa
>> aaaaaaaaa]\n"
>> +               "    aaaaaaaaaaaaaaaaaaaaaa];");
>> +
>> +  verifyFormat(
>> +      "scoped_nsobject<NSTextField> message(\n"
>> +      "    // The frame will be fixed up when |-setMessageText:| is
>> called.\n"
>> +      "    [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0,
>> 0)]);");
>> +  verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
>> +               "    aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
>> +               "         aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
>> +               "          aaaa:bbb];");
>> +  verifyFormat("[self param:function( //\n"
>> +               "                parameter)]");
>> +  verifyFormat(
>> +      "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |
>> aaaaaaaaaaaaaaa |\n"
>> +      "                 aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |
>> aaaaaaaaaaaaaaa |\n"
>> +      "                 aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
>> +
>> +  // Variadic parameters.
>> +  verifyFormat(
>> +      "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\",
>> nil];");
>> +  verifyFormat(
>> +      "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,
>> aaaaaaaaaaaaaaa,\n"
>> +      "                    aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,
>> aaaaaaaaaaaaaaa,\n"
>> +      "                    aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
>> +  verifyFormat("[self // break\n"
>> +               "      a:a\n"
>> +               "    aaa:aaa];");
>> +  verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
>> +               "          [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
>> +
>> +  // Formats pair-parameters.
>> +  verifyFormat("[I drawRectOn:surface ofSize:aa:bbb atOrigin:cc:dd];");
>> +  verifyFormat("[I drawRectOn:surface //\n"
>> +               "        ofSize:aa:bbb\n"
>> +               "      atOrigin:cc:dd];");
>> +
>> +  Style.ColumnLimit = 70;
>> +  verifyFormat(
>> +      "void f() {\n"
>> +      "  popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
>> +      "      iniithContentRect:NSMakRet(origin_global.x,
>> origin_global.y,\n"
>> +      "                                 pos.width(), pos.height())\n"
>> +      "                syeMask:NSBorderlessWindowMask\n"
>> +      "                  bking:NSBackingStoreBuffered\n"
>> +      "                    der:NO]);\n"
>> +      "}");
>> +
>> +  Style.ColumnLimit = 60;
>> +  verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaa
>> aaa.aaaaaaaa.aaaaaaaa\n"
>> +               "        .aaaaaaaa];"); // FIXME: Indentation seems off.
>> +  // FIXME: This violates the column limit.
>> +  verifyFormat(
>> +      "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
>> +      "    aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
>> +      "                  aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa
>> aaaaaaaaaaaaaaa];");
>> +
>> +  Style = getChromiumStyle(FormatStyle::LK_ObjC);
>> +  Style.ColumnLimit = 80;
>> +  verifyFormat(
>> +      "void f() {\n"
>> +      "  popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
>> +      "      initWithContentRect:NSMakeRect(origin_global.x,
>> origin_global.y,\n"
>> +      "                                     pos.width(), pos.height())\n"
>> +      "                styleMask:NSBorderlessWindowMask\n"
>> +      "                  backing:NSBackingStoreBuffered\n"
>> +      "                    defer:NO]);\n"
>> +      "}");
>> +}
>> +
>> +TEST_F(FormatTestObjC, ObjCAt) {
>> +  verifyFormat("@autoreleasepool");
>> +  verifyFormat("@catch");
>> +  verifyFormat("@class");
>> +  verifyFormat("@compatibility_alias");
>> +  verifyFormat("@defs");
>> +  verifyFormat("@dynamic");
>> +  verifyFormat("@encode");
>> +  verifyFormat("@end");
>> +  verifyFormat("@finally");
>> +  verifyFormat("@implementation");
>> +  verifyFormat("@import");
>> +  verifyFormat("@interface");
>> +  verifyFormat("@optional");
>> +  verifyFormat("@package");
>> +  verifyFormat("@private");
>> +  verifyFormat("@property");
>> +  verifyFormat("@protected");
>> +  verifyFormat("@protocol");
>> +  verifyFormat("@public");
>> +  verifyFormat("@required");
>> +  verifyFormat("@selector");
>> +  verifyFormat("@synchronized");
>> +  verifyFormat("@synthesize");
>> +  verifyFormat("@throw");
>> +  verifyFormat("@try");
>> +
>> +  EXPECT_EQ("@interface", format("@ interface"));
>> +
>> +  // The precise formatting of this doesn't matter, nobody writes code
>> like
>> +  // this.
>> +  verifyFormat("@ /*foo*/ interface");
>> +}
>> +
>> +TEST_F(FormatTestObjC, ObjCSnippets) {
>> +  verifyFormat("@autoreleasepool {\n"
>> +               "  foo();\n"
>> +               "}");
>> +  verifyFormat("@class Foo, Bar;");
>> +  verifyFormat("@compatibility_alias AliasName ExistingClass;");
>> +  verifyFormat("@dynamic textColor;");
>> +  verifyFormat("char *buf1 = @encode(int *);");
>> +  verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
>> +  verifyFormat("char *buf1 = @encode(int **);");
>> +  verifyFormat("Protocol *proto = @protocol(p1);");
>> +  verifyFormat("SEL s = @selector(foo:);");
>> +  verifyFormat("@synchronized(self) {\n"
>> +               "  f();\n"
>> +               "}");
>> +
>> +  verifyFormat("@import foo.bar;\n"
>> +               "@import baz;");
>> +
>> +  verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
>> +
>> +  verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
>> +  verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
>> +
>> +  Style = getMozillaStyle();
>> +  verifyFormat("@property (assign, getter=isEditable) BOOL editable;");
>> +  verifyFormat("@property BOOL editable;");
>> +
>> +  Style = getWebKitStyle();
>> +  verifyFormat("@property (assign, getter=isEditable) BOOL editable;");
>> +  verifyFormat("@property BOOL editable;");
>> +
>> +  Style = getGoogleStyle(FormatStyle::LK_ObjC);
>> +  verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
>> +  verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
>> +}
>> +
>> +TEST_F(FormatTestObjC, ObjCForIn) {
>> +  verifyFormat("- (void)test {\n"
>> +               "  for (NSString *n in arrayOfStrings) {\n"
>> +               "    foo(n);\n"
>> +               "  }\n"
>> +               "}");
>> +  verifyFormat("- (void)test {\n"
>> +               "  for (NSString *n in (__bridge NSArray
>> *)arrayOfStrings) {\n"
>> +               "    foo(n);\n"
>> +               "  }\n"
>> +               "}");
>> +}
>> +
>> +TEST_F(FormatTestObjC, ObjCLiterals) {
>> +  verifyFormat("@\"String\"");
>> +  verifyFormat("@1");
>> +  verifyFormat("@+4.8");
>> +  verifyFormat("@-4");
>> +  verifyFormat("@1LL");
>> +  verifyFormat("@.5");
>> +  verifyFormat("@'c'");
>> +  verifyFormat("@true");
>> +
>> +  verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
>> +  verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
>> +  verifyFormat("NSNumber *favoriteColor = @(Green);");
>> +  verifyFormat("NSString *path = @(getenv(\"PATH\"));");
>> +
>> +  verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
>> +}
>> +
>> +TEST_F(FormatTestObjC, ObjCDictLiterals) {
>> +  verifyFormat("@{");
>> +  verifyFormat("@{}");
>> +  verifyFormat("@{@\"one\" : @1}");
>> +  verifyFormat("return @{@\"one\" : @1;");
>> +  verifyFormat("@{@\"one\" : @1}");
>> +
>> +  verifyFormat("@{@\"one\" : @{@2 : @1}}");
>> +  verifyFormat("@{\n"
>> +               "  @\"one\" : @{@2 : @1},\n"
>> +               "}");
>> +
>> +  verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
>> +  verifyIncompleteFormat("[self setDict:@{}");
>> +  verifyIncompleteFormat("[self setDict:@{@1 : @2}");
>> +  verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
>> +  verifyFormat(
>> +      "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
>> +  verifyFormat(
>> +      "NSDictionary *settings = @{AVEncoderKey :
>> @(AVAudioQualityMax)};");
>> +
>> +  verifyFormat("NSDictionary *d = @{\n"
>> +               "  @\"nam\" : NSUserNam(),\n"
>> +               "  @\"dte\" : [NSDate date],\n"
>> +               "  @\"processInfo\" : [NSProcessInfo processInfo]\n"
>> +               "};");
>> +  verifyFormat(
>> +      "@{\n"
>> +      "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
>> : "
>> +      "regularFont,\n"
>> +      "};");
>> +  verifyFormat(
>> +      "@{\n"
>> +      "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
>> :\n"
>> +      "      reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
>> +      "};");
>> +
>> +  // We should try to be robust in case someone forgets the "@".
>> +  verifyFormat("NSDictionary *d = {\n"
>> +               "  @\"nam\" : NSUserNam(),\n"
>> +               "  @\"dte\" : [NSDate date],\n"
>> +               "  @\"processInfo\" : [NSProcessInfo processInfo]\n"
>> +               "};");
>> +  verifyFormat("NSMutableDictionary *dictionary =\n"
>> +               "    [NSMutableDictionary dictionaryWithDictionary:@{\n"
>> +               "      aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
>> +               "      bbbbbbbbbbbbbbbbbb : bbbbb,\n"
>> +               "      cccccccccccccccc : ccccccccccccccc\n"
>> +               "    }];");
>> +
>> +  // Ensure that casts before the key are kept on the same line as the
>> key.
>> +  verifyFormat(
>> +      "NSDictionary *d = @{\n"
>> +      "  (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa
>> id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
>> +      "  (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
>> +      "};");
>> +
>> +  Style = getGoogleStyle(FormatStyle::LK_ObjC);
>> +  verifyFormat(
>> +      "@{\n"
>> +      "  NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
>> : "
>> +      "regularFont,\n"
>> +      "};");
>> +}
>> +
>> +TEST_F(FormatTestObjC, ObjCArrayLiterals) {
>> +  verifyIncompleteFormat("@[");
>> +  verifyFormat("@[]");
>> +  verifyFormat(
>> +      "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber
>> numberWithInt:42] ];");
>> +  verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
>> +  verifyFormat("NSArray *array = @[ [foo description] ];");
>> +
>> +  verifyFormat(
>> +      "NSArray *some_variable = @[\n"
>> +      "  aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" :
>> @\"aaaaaaaaaaaaaa\",\n"
>> +      "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +      "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +      "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +      "];");
>> +  verifyFormat(
>> +      "NSArray *some_variable = @[\n"
>> +      "  aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" :
>> @\"aaaaaaaaaaaaaa\",\n"
>> +      "  @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\",
>> @\"aaaaaaaaaaaaaaaa\"\n"
>> +      "];");
>> +  verifyFormat("NSArray *some_variable = @[\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "];");
>> +  verifyFormat("NSArray *array = @[\n"
>> +               "  @\"a\",\n"
>> +               "  @\"a\",\n" // Trailing comma -> one per line.
>> +               "];");
>> +
>> +  // We should try to be robust in case someone forgets the "@".
>> +  verifyFormat("NSArray *some_variable = [\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "  @\"aaaaaaaaaaaaaaaaa\",\n"
>> +               "];");
>> +  verifyFormat(
>> +      "- (NSAttributedString *)attributedStringForSegment:(
>> NSUInteger)segment\n"
>> +      "
>>  index:(NSUInteger)index\n"
>> +      "                                nonDigitAttributes:\n"
>> +      "                                    (NSDictionary
>> *)noDigitAttributes;");
>> +  verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
>> +               "  NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
>> +               "]];");
>> +}
>> +} // end namespace
>> +} // end namespace format
>> +} // end namespace clang
>>
>> Modified: cfe/trunk/unittests/Tooling/ReplacementTest.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tool
>> ing/ReplacementTest.h?rev=289428&r1=289427&r2=289428&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/unittests/Tooling/ReplacementTest.h (original)
>> +++ cfe/trunk/unittests/Tooling/ReplacementTest.h Mon Dec 12 06:42:29
>> 2016
>> @@ -24,7 +24,7 @@ namespace tooling {
>>  /// \brief Converts a set of replacements to Replacements class.
>>  /// \return A Replacements class containing \p Replaces on success;
>> otherwise,
>>  /// an empty Replacements is returned.
>> -static tooling::Replacements
>> +inline tooling::Replacements
>>  toReplacements(const std::set<tooling::Replacement> &Replaces) {
>>    tooling::Replacements Result;
>>    for (const auto &R : Replaces) {
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170131/65ec6c67/attachment-0001.html>


More information about the cfe-commits mailing list