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.

llvm-svn: 172019
This commit is contained in:
Nico Weber 2013-01-09 23:25:37 +00:00
parent eb994f4064
commit 2ce0ac5a8c
4 changed files with 77 additions and 5 deletions

View File

@ -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

View File

@ -144,7 +144,7 @@ private:
void parseStructOrClass();
void parseObjCProtocolList();
void parseObjCUntilAtEnd();
void parseObjCInterface();
void parseObjCInterfaceOrImplementation();
void parseObjCProtocol();
void addUnwrappedLine();
bool eof() const;

View File

@ -162,7 +162,7 @@
*/
- (void) setPropertyMyClassCategory : (id) arg {}
@end
// CHECK: <Declaration>@implementation MyClass(Category) @end</Declaration>
// CHECK: <Declaration>@implementation MyClass(Category)\n@end</Declaration>
// CHECK: <Declaration>- (void)MethodMyClassCategory;</Declaration>
// CHECK: <Declaration>- (id)PropertyMyClassCategory;</Declaration>
// CHECK: <Declaration>- (void)setPropertyMyClassCategory:(id)arg;</Declaration>
@ -172,4 +172,4 @@
*/
@implementation NSObject
@end
// CHECK: <Declaration>@implementation NSObject @end</Declaration>
// CHECK: <Declaration>@implementation NSObject\n@end</Declaration>

View File

@ -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"