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