1226586Sdim//===- ChainedDiagnosticConsumer.h - Chain Diagnostic Clients ---*- C++ -*-===//
2226586Sdim//
3226586Sdim//                     The LLVM Compiler Infrastructure
4226586Sdim//
5226586Sdim// This file is distributed under the University of Illinois Open Source
6226586Sdim// License. See LICENSE.TXT for details.
7226586Sdim//
8226586Sdim//===----------------------------------------------------------------------===//
9226586Sdim
10226586Sdim#ifndef LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCONSUMER_H
11226586Sdim#define LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCONSUMER_H
12226586Sdim
13226586Sdim#include "clang/Basic/Diagnostic.h"
14226586Sdim#include "llvm/ADT/OwningPtr.h"
15226586Sdim
16226586Sdimnamespace clang {
17226586Sdimclass LangOptions;
18226586Sdim
19226586Sdim/// ChainedDiagnosticConsumer - Chain two diagnostic clients so that diagnostics
20226586Sdim/// go to the first client and then the second. The first diagnostic client
21226586Sdim/// should be the "primary" client, and will be used for computing whether the
22226586Sdim/// diagnostics should be included in counts.
23226586Sdimclass ChainedDiagnosticConsumer : public DiagnosticConsumer {
24234353Sdim  virtual void anchor();
25234353Sdim  OwningPtr<DiagnosticConsumer> Primary;
26234353Sdim  OwningPtr<DiagnosticConsumer> Secondary;
27226586Sdim
28226586Sdimpublic:
29226586Sdim  ChainedDiagnosticConsumer(DiagnosticConsumer *_Primary,
30226586Sdim                          DiagnosticConsumer *_Secondary) {
31226586Sdim    Primary.reset(_Primary);
32226586Sdim    Secondary.reset(_Secondary);
33226586Sdim  }
34226586Sdim
35226586Sdim  virtual void BeginSourceFile(const LangOptions &LO,
36226586Sdim                               const Preprocessor *PP) {
37226586Sdim    Primary->BeginSourceFile(LO, PP);
38226586Sdim    Secondary->BeginSourceFile(LO, PP);
39226586Sdim  }
40226586Sdim
41226586Sdim  virtual void EndSourceFile() {
42226586Sdim    Secondary->EndSourceFile();
43226586Sdim    Primary->EndSourceFile();
44226586Sdim  }
45226586Sdim
46234353Sdim  virtual void finish() {
47234353Sdim    Secondary->finish();
48234353Sdim    Primary->finish();
49234353Sdim  }
50234353Sdim
51226586Sdim  virtual bool IncludeInDiagnosticCounts() const {
52226586Sdim    return Primary->IncludeInDiagnosticCounts();
53226586Sdim  }
54226586Sdim
55226586Sdim  virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
56226586Sdim                                const Diagnostic &Info) {
57226586Sdim    // Default implementation (Warnings/errors count).
58226586Sdim    DiagnosticConsumer::HandleDiagnostic(DiagLevel, Info);
59226586Sdim
60226586Sdim    Primary->HandleDiagnostic(DiagLevel, Info);
61226586Sdim    Secondary->HandleDiagnostic(DiagLevel, Info);
62226586Sdim  }
63226586Sdim};
64226586Sdim
65226586Sdim} // end namspace clang
66226586Sdim
67226586Sdim#endif
68