]> granicus.if.org Git - clang/commitdiff
Turn LoggingDiagnosticClient into a more general ChainedDiagnosticClient and
authorDaniel Dunbar <daniel@zuster.org>
Wed, 11 Nov 2009 08:13:24 +0000 (08:13 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 11 Nov 2009 08:13:24 +0000 (08:13 +0000)
move to libFrontend.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86817 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/ChainedDiagnosticClient.h [new file with mode: 0644]
tools/clang-cc/clang-cc.cpp

diff --git a/include/clang/Frontend/ChainedDiagnosticClient.h b/include/clang/Frontend/ChainedDiagnosticClient.h
new file mode 100644 (file)
index 0000000..9dc3898
--- /dev/null
@@ -0,0 +1,56 @@
+//===--- ChainedDiagnosticClient.h - Chain Diagnostic Clients ---*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCLIENT_H
+#define LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCLIENT_H
+
+#include "clang/Basic/Diagnostic.h"
+
+namespace clang {
+class LangOptions;
+
+/// ChainedDiagnosticClient - Chain two diagnostic clients so that diagnostics
+/// go to the first client and then the second. The first diagnostic client
+/// should be the "primary" client, and will be used for computing whether the
+/// diagnostics should be included in counts.
+class ChainedDiagnosticClient : public DiagnosticClient {
+  llvm::OwningPtr<DiagnosticClient> Primary;
+  llvm::OwningPtr<DiagnosticClient> Secondary;
+
+public:
+  ChainedDiagnosticClient(DiagnosticClient *_Primary,
+                          DiagnosticClient *_Secondary) {
+    Primary.reset(_Primary);
+    Secondary.reset(_Secondary);
+  }
+
+  virtual void BeginSourceFile(const LangOptions &LO) {
+    Primary->BeginSourceFile(LO);
+    Secondary->BeginSourceFile(LO);
+  }
+
+  virtual void EndSourceFile() {
+    Secondary->EndSourceFile();
+    Primary->EndSourceFile();
+  }
+
+  virtual bool IncludeInDiagnosticCounts() const {
+    return Primary->IncludeInDiagnosticCounts();
+  }
+
+  virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
+                                const DiagnosticInfo &Info) {
+    Primary->HandleDiagnostic(DiagLevel, Info);
+    Secondary->HandleDiagnostic(DiagLevel, Info);
+  }
+};
+
+} // end namspace clang
+
+#endif
index df15e5b173a3151e22cb17d700cb2d2bd736c7f8..ddd8d3100c76146a8a25c10951a3e30bc9a2b283 100644 (file)
@@ -19,6 +19,7 @@
 #include "clang/Frontend/AnalysisConsumer.h"
 #include "clang/Frontend/ASTConsumers.h"
 #include "clang/Frontend/ASTUnit.h"
+#include "clang/Frontend/ChainedDiagnosticClient.h"
 #include "clang/Frontend/CompilerInvocation.h"
 #include "clang/Frontend/DiagnosticOptions.h"
 #include "clang/Frontend/FixItRewriter.h"
@@ -811,48 +812,9 @@ DumpBuildInformation("dump-build-information",
 
 static llvm::raw_ostream *BuildLogFile = 0;
 
-/// LoggingDiagnosticClient - This is a simple diagnostic client that forwards
-/// all diagnostics to both BuildLogFile and a chained DiagnosticClient.
-namespace {
-class LoggingDiagnosticClient : public DiagnosticClient {
-  llvm::OwningPtr<DiagnosticClient> Chain1;
-  llvm::OwningPtr<DiagnosticClient> Chain2;
-public:
-
-  LoggingDiagnosticClient(const DiagnosticOptions &DiagOpts,
-                          DiagnosticClient *Normal) {
-    // Output diags both where requested...
-    Chain1.reset(Normal);
-    // .. and to our log file.
-    Chain2.reset(new TextDiagnosticPrinter(*BuildLogFile, DiagOpts));
-  }
-
-  virtual void BeginSourceFile(const LangOptions &LO) {
-    Chain1->BeginSourceFile(LO);
-    Chain2->BeginSourceFile(LO);
-  }
-
-  virtual void EndSourceFile() {
-    Chain1->EndSourceFile();
-    Chain2->EndSourceFile();
-  }
-
-  virtual bool IncludeInDiagnosticCounts() const {
-    return Chain1->IncludeInDiagnosticCounts();
-  }
-
-  virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
-                                const DiagnosticInfo &Info) {
-    Chain1->HandleDiagnostic(DiagLevel, Info);
-    Chain2->HandleDiagnostic(DiagLevel, Info);
-  }
-};
-} // end anonymous namespace.
-
 static void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts,
                               unsigned argc, char **argv,
                               llvm::OwningPtr<DiagnosticClient> &DiagClient) {
-
   std::string ErrorInfo;
   BuildLogFile = new llvm::raw_fd_ostream(DumpBuildInformation.c_str(),
                                           ErrorInfo);
@@ -871,9 +833,9 @@ static void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts,
     (*BuildLogFile) << argv[i] << ' ';
   (*BuildLogFile) << '\n';
 
-  // LoggingDiagnosticClient - Insert a new logging diagnostic client in between
-  // the diagnostic producers and the normal receiver.
-  DiagClient.reset(new LoggingDiagnosticClient(DiagOpts, DiagClient.take()));
+  // Chain in a diagnostic client which will log the diagnostics.
+  DiagnosticClient *Logger = new TextDiagnosticPrinter(*BuildLogFile, DiagOpts);
+  DiagClient.reset(new ChainedDiagnosticClient(DiagClient.take(), Logger));
 }