diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index df5b4cbb9fd9..cee587bf3236 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -1338,10 +1338,12 @@ private:
// 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/clang/test/Index/comment-objc-decls.m b/clang/test/Index/comment-objc-decls.m
index 58e65e4ca52e..ae3b0bbf415d 100644
--- a/clang/test/Index/comment-objc-decls.m
+++ b/clang/test/Index/comment-objc-decls.m
@@ -45,7 +45,7 @@
id IvarNSObject;
}
@end
-// CHECK: Declaration>@interface NSObject { id IvarNSObject; }\n@end
+// CHECK: Declaration>@interface NSObject {\n id IvarNSObject;\n}\n@end
// CHECK: id IvarNSObject
/**
@@ -73,7 +73,7 @@
*/
@property (copy) id PropertyMyClass;
@end
-// CHECK: @interface MyClass : NSObject <MyProto> { id IvarMyClass; }\n@end
+// CHECK: @interface MyClass : NSObject <MyProto> {\n id IvarMyClass;\n}\n@end
// CHECK: id IvarMyClass
// CHECK: - (id)MethodMyClass;
// CHECK: + (id)ClassMethodMyClass;
@@ -90,7 +90,7 @@
id IvarMyClassExtension;
}
@end
-// CHECK: @interface MyClass () { id IvarMyClassExtension; }\n@end
+// CHECK: @interface MyClass () {\n id IvarMyClassExtension;\n}\n@end
// CHECK: id IvarMyClassExtension
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 6beee3186b72..a2f150d18625 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -405,9 +405,15 @@ TEST_F(FormatTest, FormatTryCatch) {
}
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 @@ TEST_F(FormatTest, FormatObjCInterface) {
"+(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 { int _i; }\n"
+ verifyFormat("@interface Foo : Bar {\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) { int _i; }\n"
+ verifyFormat("@interface Foo (HackStuff) {\n"
+ " int _i;\n"
+ "}\n"
"+ (id)init;\n"
"@end");
}
@@ -1363,7 +1381,9 @@ TEST_F(FormatTest, FormatObjCImplementation) {
" 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 @@ TEST_F(FormatTest, FormatObjCImplementation) {
"+ (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, ObjCAt) {
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_;");