ObjC migrator: More knobs for migrating
conforming protocols to each class. wip.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186231 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp
index b170e08..d80c6a1 100644
--- a/lib/ARCMigrate/ObjCMT.cpp
+++ b/lib/ARCMigrate/ObjCMT.cpp
@@ -235,6 +235,13 @@
   }
 }
 
+static bool 
+ClassImplementsAllMethodsAndProprties(ASTContext &Ctx,
+                                      const ObjCImplementationDecl *ImpDecl,
+                                      ObjCProtocolDecl *Protocol) {
+  return false;
+}
+
 void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx,
                                             const ObjCImplementationDecl *ImpDecl) {
   const ObjCInterfaceDecl *IDecl = ImpDecl->getClassInterface();
@@ -244,16 +251,25 @@
   // and make them explicit.
   llvm::SmallPtrSet<ObjCProtocolDecl *, 8> ExplicitProtocols;
   Ctx.CollectInheritedProtocols(IDecl, ExplicitProtocols);
-  llvm::SmallPtrSet<ObjCProtocolDecl *, 8> PotentialImplicitProtocols;
+  llvm::SmallVector<ObjCProtocolDecl *, 8> PotentialImplicitProtocols;
   
-  for (llvm::SmallPtrSet<ObjCProtocolDecl*,32>::iterator I =
+  for (llvm::SmallPtrSet<ObjCProtocolDecl*, 32>::iterator I =
        ObjCProtocolDecls.begin(),
        E = ObjCProtocolDecls.end(); I != E; ++I)
     if (!ExplicitProtocols.count(*I))
-      PotentialImplicitProtocols.insert(*I);
+      PotentialImplicitProtocols.push_back(*I);
   
   if (PotentialImplicitProtocols.empty())
     return;
+
+  // go through list of non-optional methods and properties in each protocol
+  // in the PotentialImplicitProtocols list. If class implements every one of the
+  // methods and properties, then this class conforms to this protocol.
+  llvm::SmallVector<ObjCProtocolDecl*, 8> ConformingProtocols;
+  for (unsigned i = 0, e = PotentialImplicitProtocols.size(); i != e; i++)
+    if (ClassImplementsAllMethodsAndProprties(Ctx, ImpDecl, 
+                                              PotentialImplicitProtocols[i]))
+      ConformingProtocols.push_back(PotentialImplicitProtocols[i]);
 }
 
 namespace {