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

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 31 10:32:40 PST 2017


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/
> ContinuationIndenter.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/
> Format.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/
> FormatTokenLexer.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/
> TokenAnnotator.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-
> format/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/
> Format/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/
> Format/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:NSBackingStoreBuffered\n"
> -      "                                   defer:YES]))");
> -
> -  verifyFormat(
> -      "[foo checkThatBreakingAfterColonWorksOk:\n"
> -      "         [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
> -
> -  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:
> kBookmarkButtonDragType]\n"
> -      "           owner:nillllll];");
> -
> -  verifyFormat(
> -      "[pboard setData:[NSData dataWithBytes:&button
> length:sizeof(button)]\n"
> -      "        forType:kBookmarkButtonDragType];");
> -
> -  verifyFormat("[defaultCenter addObserver:self\n"
> -               "                  selector:@selector(
> willEnterFullscreen)\n"
> -               "                      name:kWillEnterFullscreenNotificati
> on\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[
> aaaaaaaaaaaaaaaaaaaaa]\n"
> -               "    aaaaaaaaaaaaaaaaaaaaaa];");
> -  verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.
> aaaaaaaa.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:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
> aaaaaaaaaaa];",
> -      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/
> Format/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:NSBackingStoreBuffered\n"
> +      "                                   defer:YES]))");
> +
> +  verifyFormat(
> +      "[foo checkThatBreakingAfterColonWorksOk:\n"
> +      "         [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
> +
> +  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:
> kBookmarkButtonDragType]\n"
> +      "           owner:nillllll];");
> +
> +  verifyFormat(
> +      "[pboard setData:[NSData dataWithBytes:&button
> length:sizeof(button)]\n"
> +      "        forType:kBookmarkButtonDragType];");
> +
> +  verifyFormat("[defaultCenter addObserver:self\n"
> +               "                  selector:@selector(
> willEnterFullscreen)\n"
> +               "                      name:kWillEnterFullscreenNotificati
> on\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[
> aaaaaaaaaaaaaaaaaaaaa]\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.
> aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
> +               "        .aaaaaaaa];"); // FIXME: Indentation seems off.
> +  // FIXME: This violates the column limit.
> +  verifyFormat(
> +      "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
> +      "    aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
> +      "                  aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
> aaaaaaaaaaa];");
> +
> +  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/
> Tooling/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/c9491519/attachment-0001.html>


More information about the cfe-commits mailing list