]> granicus.if.org Git - clang/commitdiff
ObjectiveC migrator: When adding conforming protocol,
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 17 Jul 2013 00:02:22 +0000 (00:02 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 17 Jul 2013 00:02:22 +0000 (00:02 +0000)
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

lib/ARCMigrate/ObjCMT.cpp
test/ARCMT/objcmt-protocol-conformance.m
test/ARCMT/objcmt-protocol-conformance.m.result

index ab4aa0e08504964ba1a0457c963d639f8cc6ef1e..46ee88e7049815d404c64bd6c40547ca9a309e2d 100644 (file)
@@ -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<P1>), No need to include P1.
+  llvm::SmallVector<ObjCProtocolDecl*, 8> 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);
 }
 
index 3ef2eff13f24955b4728e05aa4aa4a9493812ae3..2b9c93f3fced27da0b62dd8f35a0daefa1658705 100644 (file)
 @implementation Test5
 @synthesize Prop=_XXX;
 @end
+
+@protocol P5 <P3, P4>
+@property (copy) id Prop;
+@end
+
+@protocol P6 <P3, P4, P5>
+@property (copy) id Prop;
+@end
+
+@interface Test6 : NSObject // Test for minimal listing of conforming protocols
+@property (copy) id Prop;
+@end
+
+@implementation Test6 
+@end
+
index 11bf7847280ec8663d0d3cc584616fd39e89263e..ba3264588018799bcfbbc79622480df2d3f8cfd0 100644 (file)
 @implementation Test5
 @synthesize Prop=_XXX;
 @end
+
+@protocol P5 <P3, P4>
+@property (copy) id Prop;
+@end
+
+@protocol P6 <P3, P4, P5>
+@property (copy) id Prop;
+@end
+
+@interface Test6 : NSObject<P6>  // Test for minimal listing of conforming protocols
+@property (copy) id Prop;
+@end
+
+@implementation Test6 
+@end
+