From 2acb7b7bb14ced179f3d664337dc069bab9f4e89 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Fri, 11 Jan 2013 19:17:44 +0000 Subject: [PATCH] Fix single-line optimization for ObjC. Puts blocks always into multiple lines when they start with an ObjC keyword or minus. llvm-svn: 172238 --- clang/lib/Format/Format.cpp | 10 +++-- clang/test/Index/comment-objc-decls.m | 6 +-- clang/unittests/Format/FormatTest.cpp | 56 ++++++++++++++++++++------- 3 files changed, 51 insertions(+), 21 deletions(-) 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_;");