diff options
-rw-r--r-- | clang/lib/Edit/RewriteObjCFoundationAPI.cpp | 44 | ||||
-rw-r--r-- | clang/test/ARCMT/objcmt-protocol-conformance.m | 48 | ||||
-rw-r--r-- | clang/test/ARCMT/objcmt-protocol-conformance.m.result | 48 |
3 files changed, 118 insertions, 22 deletions
diff --git a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp index fd9c16ee6a0..30a9f522b2f 100644 --- a/clang/lib/Edit/RewriteObjCFoundationAPI.cpp +++ b/clang/lib/Edit/RewriteObjCFoundationAPI.cpp @@ -406,31 +406,31 @@ bool edit::rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl, llvm::SmallVectorImpl<ObjCProtocolDecl*> &ConformingProtocols, const NSAPI &NS, Commit &commit) { const ObjCList<ObjCProtocolDecl> &Protocols = IDecl->getReferencedProtocols(); - - // ASTContext &Context = NS.getASTContext(); - std::string ClassString = "@interface "; - ClassString += IDecl->getNameAsString(); - - if (IDecl->getSuperClass()) { - ClassString += " : "; - ClassString += IDecl->getSuperClass()->getNameAsString(); - } - if (Protocols.empty()) - ClassString += '<'; + std::string ClassString; + SourceLocation EndLoc = + IDecl->getSuperClass() ? IDecl->getSuperClassLoc() : IDecl->getLocation(); - for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(), - E = Protocols.end(); I != E; ++I) { - ClassString += (I == Protocols.begin() ? '<' : ','); - ClassString += (*I)->getNameAsString(); + if (Protocols.empty()) { + ClassString = '<'; + for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) { + ClassString += ConformingProtocols[i]->getNameAsString(); + if (i != (e-1)) + ClassString += ", "; + } + ClassString += "> "; } - if (!Protocols.empty()) - ClassString += ','; - for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) { - ClassString += ConformingProtocols[i]->getNameAsString(); - if (i != (e-1)) - ClassString += ','; + else { + ClassString = ", "; + for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) { + ClassString += ConformingProtocols[i]->getNameAsString(); + if (i != (e-1)) + ClassString += ", "; + } + ObjCInterfaceDecl::protocol_loc_iterator PL = IDecl->protocol_loc_end() - 1; + EndLoc = *PL; } - ClassString += "> "; + + commit.insertAfterToken(EndLoc, ClassString); return true; } diff --git a/clang/test/ARCMT/objcmt-protocol-conformance.m b/clang/test/ARCMT/objcmt-protocol-conformance.m new file mode 100644 index 00000000000..2ad8a659fae --- /dev/null +++ b/clang/test/ARCMT/objcmt-protocol-conformance.m @@ -0,0 +1,48 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -objcmt-migrate-property -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties -triple x86_64-apple-darwin11 +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties %s.result + +@interface NSObject @end + +@protocol P +- (id) Meth1: (double) arg; +@end + +@interface Test1 // Test for no super class and no protocol list +@end + +@implementation Test1 +- (id) Meth1: (double) arg { return 0; } +@end + +@protocol P1 @end +@protocol P2 @end + +@interface Test2 <P1, P2> // Test for no super class and with protocol list +{ + id IVAR1; + id IVAR2; +} +@end + +@implementation Test2 +- (id) Meth1: (double) arg { return 0; } +@end + +@interface Test3 : NSObject { // Test for Super class and no protocol list + id IV1; +} +@end + +@implementation Test3 +- (id) Meth1: (double) arg { return 0; } +@end + +@interface Test4 : NSObject <P1, P2> // Test for Super class and protocol list +@end + +@implementation Test4 +- (id) Meth1: (double) arg { return 0; } +@end + diff --git a/clang/test/ARCMT/objcmt-protocol-conformance.m.result b/clang/test/ARCMT/objcmt-protocol-conformance.m.result new file mode 100644 index 00000000000..71fa3b1b06d --- /dev/null +++ b/clang/test/ARCMT/objcmt-protocol-conformance.m.result @@ -0,0 +1,48 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -objcmt-migrate-property -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties -triple x86_64-apple-darwin11 +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc -fobjc-default-synthesize-properties %s.result + +@interface NSObject @end + +@protocol P +- (id) Meth1: (double) arg; +@end + +@interface Test1<P> // Test for no super class and no protocol list +@end + +@implementation Test1 +- (id) Meth1: (double) arg { return 0; } +@end + +@protocol P1 @end +@protocol P2 @end + +@interface Test2 <P1, P2, P> // Test for no super class and with protocol list +{ + id IVAR1; + id IVAR2; +} +@end + +@implementation Test2 +- (id) Meth1: (double) arg { return 0; } +@end + +@interface Test3 : NSObject<P> { // Test for Super class and no protocol list + id IV1; +} +@end + +@implementation Test3 +- (id) Meth1: (double) arg { return 0; } +@end + +@interface Test4 : NSObject <P1, P2, P> // Test for Super class and protocol list +@end + +@implementation Test4 +- (id) Meth1: (double) arg { return 0; } +@end + |