From 50767d8c8f2f667255bdb99692c0467ce992bc67 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Wed, 9 Jan 2013 23:25:37 +0000 Subject: [PATCH] Formatter: Add support for @implementation. Just reuse the @interface code for this. It accepts slightly more than necessary (@implementation cannot have protocol lists), but that's ok. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172019 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/UnwrappedLineParser.cpp | 5 ++- lib/Format/UnwrappedLineParser.h | 2 +- test/Index/comment-objc-decls.m | 4 +- unittests/Format/FormatTest.cpp | 71 ++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 5 deletions(-) diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 1d0cb30af8..c049ac607d 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -209,7 +209,8 @@ void UnwrappedLineParser::parseStructuralElement() { case tok::objc_private: return parseAccessSpecifier(); case tok::objc_interface: - return parseObjCInterface(); + case tok::objc_implementation: + return parseObjCInterfaceOrImplementation(); case tok::objc_protocol: return parseObjCProtocol(); case tok::objc_end: @@ -519,7 +520,7 @@ void UnwrappedLineParser::parseObjCUntilAtEnd() { } while (!eof()); } -void UnwrappedLineParser::parseObjCInterface() { +void UnwrappedLineParser::parseObjCInterfaceOrImplementation() { nextToken(); nextToken(); // interface name diff --git a/lib/Format/UnwrappedLineParser.h b/lib/Format/UnwrappedLineParser.h index 303afc2d98..16ad37eec6 100644 --- a/lib/Format/UnwrappedLineParser.h +++ b/lib/Format/UnwrappedLineParser.h @@ -144,7 +144,7 @@ private: void parseStructOrClass(); void parseObjCProtocolList(); void parseObjCUntilAtEnd(); - void parseObjCInterface(); + void parseObjCInterfaceOrImplementation(); void parseObjCProtocol(); void addUnwrappedLine(); bool eof() const; diff --git a/test/Index/comment-objc-decls.m b/test/Index/comment-objc-decls.m index 4c9f878c35..c61d99598d 100644 --- a/test/Index/comment-objc-decls.m +++ b/test/Index/comment-objc-decls.m @@ -162,7 +162,7 @@ */ - (void) setPropertyMyClassCategory : (id) arg {} @end -// CHECK: @implementation MyClass(Category) @end +// CHECK: @implementation MyClass(Category)\n@end // CHECK: - (void)MethodMyClassCategory; // CHECK: - (id)PropertyMyClassCategory; // CHECK: - (void)setPropertyMyClassCategory:(id)arg; @@ -172,4 +172,4 @@ */ @implementation NSObject @end -// CHECK: @implementation NSObject @end +// CHECK: @implementation NSObject\n@end diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 15fe9aa9d7..b536e012eb 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -1251,6 +1251,77 @@ TEST_F(FormatTest, FormatObjCInterface) { "@end"); } +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" + "@end"); + + verifyFormat("@implementation Foo\n" + "@end\n" + "@implementation Bar\n" + "@end"); + + verifyFormat("@implementation Foo : Bar\n" + "+ (id)init {\n" + "}\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"); + + // FIXME: there should be a space before '(' for categories. + verifyFormat("@implementation Foo(HackStuff)\n" + "+ (id)init {\n" + "}\n" + "@end"); +} + TEST_F(FormatTest, FormatObjCProtocol) { verifyFormat("@protocol Foo\n" "@property(weak) id delegate;\n" -- 2.40.0