Turn LoggingDiagnosticClient into a more general ChainedDiagnosticClient and

move to libFrontend.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86817 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-11-11 08:13:24 +00:00
Родитель 56749087b5
Коммит dbf75feeb6
2 изменённых файлов: 60 добавлений и 42 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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));
}