Acting on Daniel's nagging, remove PathDiagnosticClientFactory() and
migrate work in the destructors of PathDiagnosticClients from their
destructors to FlushReports().  The destructors now currently call
FlushReports(); this will be fixed in a subsequent patch.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86108 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Frontend/PlistDiagnostics.cpp b/lib/Frontend/PlistDiagnostics.cpp
index a10ecd4..1579bad 100644
--- a/lib/Frontend/PlistDiagnostics.cpp
+++ b/lib/Frontend/PlistDiagnostics.cpp
@@ -36,14 +36,20 @@
     std::vector<const PathDiagnostic*> BatchedDiags;
     const std::string OutputFile;
     const LangOptions &LangOpts;
-    llvm::OwningPtr<PathDiagnosticClientFactory> PF;
-    llvm::OwningPtr<PathDiagnosticClient> SubPDC;
-    llvm::SmallVector<std::string, 1> FilesMade;
+    llvm::OwningPtr<PathDiagnosticClient> SubPD;
   public:
     PlistDiagnostics(const std::string& prefix, const LangOptions &LangOpts,
-                     PathDiagnosticClientFactory *pf);
-    ~PlistDiagnostics();
+                     PathDiagnosticClient *subPD);
+
+    ~PlistDiagnostics() { FlushDiagnostics(NULL); }
+
+    void FlushDiagnostics(llvm::SmallVectorImpl<std::string> *FilesMade);
+    
     void HandlePathDiagnostic(const PathDiagnostic* D);
+    
+    virtual llvm::StringRef getName() const {
+      return "PlistDiagnostics";
+    }
 
     PathGenerationScheme getGenerationScheme() const;
     bool supportsLogicalOpControlFlow() const { return true; }
@@ -54,22 +60,18 @@
 
 PlistDiagnostics::PlistDiagnostics(const std::string& output,
                                    const LangOptions &LO,
-                                   PathDiagnosticClientFactory *pf)
-  : OutputFile(output), LangOpts(LO), PF(pf) {
-
-  if (PF)
-    SubPDC.reset(PF->createPathDiagnosticClient(&FilesMade));
-}
+                                   PathDiagnosticClient *subPD)
+  : OutputFile(output), LangOpts(LO), SubPD(subPD) {}
 
 PathDiagnosticClient*
 clang::CreatePlistDiagnosticClient(const std::string& s, Preprocessor *PP,
-                                   PathDiagnosticClientFactory *PF) {
-  return new PlistDiagnostics(s, PP->getLangOptions(), PF);
+                                   PathDiagnosticClient *subPD) {
+  return new PlistDiagnostics(s, PP->getLangOptions(), subPD);
 }
 
 PathDiagnosticClient::PathGenerationScheme
 PlistDiagnostics::getGenerationScheme() const {
-  if (const PathDiagnosticClient *PD = SubPDC.get())
+  if (const PathDiagnosticClient *PD = SubPD.get())
     return PD->getGenerationScheme();
 
   return Extensive;
@@ -306,7 +308,8 @@
   BatchedDiags.push_back(D);
 }
 
-PlistDiagnostics::~PlistDiagnostics() {
+void PlistDiagnostics::FlushDiagnostics(llvm::SmallVectorImpl<std::string>
+                                        *FilesMade) {
 
   // Build up a set of FIDs that we use by scanning the locations and
   // ranges of the diagnostics.
@@ -395,19 +398,16 @@
     EmitLocation(o, *SM, LangOpts, D->getLocation(), FM, 2);
 
     // Output the diagnostic to the sub-diagnostic client, if any.
-    if (PF) {
-      if (!SubPDC.get())
-        SubPDC.reset(PF->createPathDiagnosticClient(&FilesMade));
+    if (SubPD) {
+      SubPD->HandlePathDiagnostic(OwnedD.take());
+      llvm::SmallVector<std::string, 1> SubFilesMade;
+      SubPD->FlushDiagnostics(SubFilesMade);
 
-      FilesMade.clear();
-      SubPDC->HandlePathDiagnostic(OwnedD.take());
-      SubPDC.reset(0);
-
-      if (!FilesMade.empty()) {
-        o << "  <key>" << PF->getName() << "_files</key>\n";
+      if (!SubFilesMade.empty()) {
+        o << "  <key>" << SubPD->getName() << "_files</key>\n";
         o << "  <array>\n";
-        for (size_t i = 0, n = FilesMade.size(); i < n ; ++i)
-          o << "   <string>" << FilesMade[i] << "</string>\n";
+        for (size_t i = 0, n = SubFilesMade.size(); i < n ; ++i)
+          o << "   <string>" << SubFilesMade[i] << "</string>\n";
         o << "  </array>\n";
       }
     }
@@ -420,4 +420,7 @@
 
   // Finish.
   o << "</dict>\n</plist>";
+  
+  if (FilesMade)
+    FilesMade->push_back(OutputFile);
 }