Fix single-line optimization for ObjC.

Puts blocks always into multiple lines when they start with an ObjC
keyword or minus.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172238 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp
index df5b4cb..cee587b 100644
--- a/lib/Format/Format.cpp
+++ b/lib/Format/Format.cpp
@@ -1338,10 +1338,12 @@
     // brace.
     FormatToken *Last = &Combined.RootToken;
     bool AllowedTokens =
-        !Last->Tok.is(tok::kw_if) && !Last->Tok.is(tok::kw_while) &&
-        !Last->Tok.is(tok::kw_do) && !Last->Tok.is(tok::r_brace) &&
-        !Last->Tok.is(tok::kw_else) && !Last->Tok.is(tok::kw_try) &&
-        !Last->Tok.is(tok::kw_catch) && !Last->Tok.is(tok::kw_for);
+        Last->Tok.isNot(tok::kw_if) && Last->Tok.isNot(tok::kw_while) &&
+        Last->Tok.isNot(tok::kw_do) && Last->Tok.isNot(tok::r_brace) &&
+        Last->Tok.isNot(tok::kw_else) && Last->Tok.isNot(tok::kw_try) &&
+        Last->Tok.isNot(tok::kw_catch) && Last->Tok.isNot(tok::kw_for) &&
+        // This gets rid of all ObjC @ keywords and - based definitions.
+        Last->Tok.isNot(tok::at) && Last->Tok.isNot(tok::minus);
     while (!Last->Children.empty())
       Last = &Last->Children.back();
     if (!Last->Tok.is(tok::l_brace))
diff --git a/test/Index/comment-objc-decls.m b/test/Index/comment-objc-decls.m
index 58e65e4..ae3b0bb 100644
--- a/test/Index/comment-objc-decls.m
+++ b/test/Index/comment-objc-decls.m
@@ -45,7 +45,7 @@
   id IvarNSObject;
 }
 @end
-// CHECK: Declaration>@interface NSObject { id IvarNSObject; }\n@end</Declaration>
+// CHECK: Declaration>@interface NSObject {\n  id IvarNSObject;\n}\n@end</Declaration>
 // CHECK: <Declaration>id IvarNSObject</Declaration>
 
 /**
@@ -73,7 +73,7 @@
 */
 @property (copy) id PropertyMyClass;
 @end
-// CHECK: <Declaration>@interface MyClass : NSObject &lt;MyProto&gt; { id IvarMyClass; }\n@end</Declaration>
+// CHECK: <Declaration>@interface MyClass : NSObject &lt;MyProto&gt; {\n    id IvarMyClass;\n}\n@end</Declaration>
 // CHECK: <Declaration>id IvarMyClass</Declaration>
 // CHECK: <Declaration>- (id)MethodMyClass;</Declaration>
 // CHECK: <Declaration>+ (id)ClassMethodMyClass;</Declaration>
@@ -90,7 +90,7 @@
   id IvarMyClassExtension;
 }
 @end
-// CHECK: <Declaration>@interface MyClass () { id IvarMyClassExtension; }\n@end</Declaration>
+// CHECK: <Declaration>@interface MyClass () {\n  id IvarMyClassExtension;\n}\n@end</Declaration>
 // CHECK: <Declaration>id IvarMyClassExtension</Declaration>
 
 
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index 6beee31..a2f150d 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/unittests/Format/FormatTest.cpp
@@ -405,9 +405,15 @@
 }
 
 TEST_F(FormatTest, FormatObjCTryCatch) {
-  verifyFormat("@try { f(); }\n"
-               "@catch (NSException e) { @throw; }\n"
-               "@finally { exit(42); }");
+  verifyFormat("@try {\n"
+               "  f();\n"
+               "}\n"
+               "@catch (NSException e) {\n"
+               "  @throw;\n"
+               "}\n"
+               "@finally {\n"
+               "  exit(42);\n"
+               "}");
 }
 
 TEST_F(FormatTest, StaticInitializers) {
@@ -1305,27 +1311,39 @@
                      "+(id) init;\n"
                      "@end");
 
-  verifyFormat("@interface Foo { int _i; }\n"
+  verifyFormat("@interface Foo {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init;\n"
                "@end");
 
-  verifyFormat("@interface Foo : Bar { int _i; }\n"
+  verifyFormat("@interface Foo : Bar {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init;\n"
                "@end");
 
-  verifyFormat("@interface Foo : Bar <Baz, Quux> { int _i; }\n"
+  verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init;\n"
                "@end");
 
-  verifyFormat("@interface Foo (HackStuff) { int _i; }\n"
+  verifyFormat("@interface Foo (HackStuff) {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init;\n"
                "@end");
 
-  verifyFormat("@interface Foo () { int _i; }\n"
+  verifyFormat("@interface Foo () {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init;\n"
                "@end");
 
-  verifyFormat("@interface Foo (HackStuff) <MyProtocol> { int _i; }\n"
+  verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init;\n"
                "@end");
 }
@@ -1363,7 +1381,9 @@
                "    return nil;\n"
                "}\n"
                "// Look, a comment!\n"
-               "- (int)answerWith:(int)i { return i; }\n"
+               "- (int)answerWith:(int)i {\n"
+               "  return i;\n"
+               "}\n"
                "@end");
 
   verifyFormat("@implementation Foo\n"
@@ -1375,11 +1395,15 @@
                "+ (id)init {}\n"
                "@end");
 
-  verifyFormat("@implementation Foo { int _i; }\n"
+  verifyFormat("@implementation Foo {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init {}\n"
                "@end");
 
-  verifyFormat("@implementation Foo : Bar { int _i; }\n"
+  verifyFormat("@implementation Foo : Bar {\n"
+               "  int _i;\n"
+               "}\n"
                "+ (id)init {}\n"
                "@end");
 
@@ -1469,14 +1493,18 @@
 
 TEST_F(FormatTest, ObjCSnippets) {
   // FIXME: Make the uncommented lines below pass.
-  verifyFormat("@autoreleasepool { foo(); }");
+  verifyFormat("@autoreleasepool {\n"
+               "  foo();\n"
+               "}");
   verifyFormat("@class Foo, Bar;");
   verifyFormat("@compatibility_alias AliasName ExistingClass;");
   verifyFormat("@dynamic textColor;");
   //verifyFormat("char *buf1 = @encode(int **);");
   verifyFormat("Protocol *proto = @protocol(p1);");
   //verifyFormat("SEL s = @selector(foo:);");
-  verifyFormat("@synchronized(self) { f(); }");
+  verifyFormat("@synchronized(self) {\n"
+               "  f();\n"
+               "}");
 
   verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
   verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");