From: Fariborz Jahanian Date: Wed, 17 Jul 2013 00:02:22 +0000 (+0000) Subject: ObjectiveC migrator: When adding conforming protocol, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e8280188f7245e479418a716c3959f66b48ef64a;p=clang ObjectiveC migrator: When adding conforming protocol, only add outer-most conforming protocols as adding others are redundant. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186473 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index ab4aa0e085..46ee88e704 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -329,8 +329,29 @@ void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx, if (ConformingProtocols.empty()) return; + + // Further reduce number of conforming protocols. If protocol P1 is in the list + // protocol P2 (P2), No need to include P1. + llvm::SmallVector MinimalConformingProtocols; + for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) { + bool DropIt = false; + ObjCProtocolDecl *TargetPDecl = ConformingProtocols[i]; + for (unsigned i1 = 0, e1 = ConformingProtocols.size(); i1 != e1; i1++) { + ObjCProtocolDecl *PDecl = ConformingProtocols[i1]; + if (PDecl == TargetPDecl) + continue; + if (PDecl->lookupProtocolNamed( + TargetPDecl->getDeclName().getAsIdentifierInfo())) { + DropIt = true; + break; + } + } + if (!DropIt) + MinimalConformingProtocols.push_back(TargetPDecl); + } edit::Commit commit(*Editor); - edit::rewriteToObjCInterfaceDecl(IDecl, ConformingProtocols, *NSAPIObj, commit); + edit::rewriteToObjCInterfaceDecl(IDecl, MinimalConformingProtocols, + *NSAPIObj, commit); Editor->commit(commit); } diff --git a/test/ARCMT/objcmt-protocol-conformance.m b/test/ARCMT/objcmt-protocol-conformance.m index 3ef2eff13f..2b9c93f3fc 100644 --- a/test/ARCMT/objcmt-protocol-conformance.m +++ b/test/ARCMT/objcmt-protocol-conformance.m @@ -61,3 +61,19 @@ @implementation Test5 @synthesize Prop=_XXX; @end + +@protocol P5 +@property (copy) id Prop; +@end + +@protocol P6 +@property (copy) id Prop; +@end + +@interface Test6 : NSObject // Test for minimal listing of conforming protocols +@property (copy) id Prop; +@end + +@implementation Test6 +@end + diff --git a/test/ARCMT/objcmt-protocol-conformance.m.result b/test/ARCMT/objcmt-protocol-conformance.m.result index 11bf784728..ba32645880 100644 --- a/test/ARCMT/objcmt-protocol-conformance.m.result +++ b/test/ARCMT/objcmt-protocol-conformance.m.result @@ -61,3 +61,19 @@ @implementation Test5 @synthesize Prop=_XXX; @end + +@protocol P5 +@property (copy) id Prop; +@end + +@protocol P6 +@property (copy) id Prop; +@end + +@interface Test6 : NSObject // Test for minimal listing of conforming protocols +@property (copy) id Prop; +@end + +@implementation Test6 +@end +