1 //===- ChainedDiagnosticConsumer.h - Chain Diagnostic Clients ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCONSUMER_H 11 #define LLVM_CLANG_FRONTEND_CHAINEDDIAGNOSTICCONSUMER_H 12 13 #include "clang/Basic/Diagnostic.h" 14 #include <memory> 15 16 namespace clang { 17 class LangOptions; 18 19 /// ChainedDiagnosticConsumer - Chain two diagnostic clients so that diagnostics 20 /// go to the first client and then the second. The first diagnostic client 21 /// should be the "primary" client, and will be used for computing whether the 22 /// diagnostics should be included in counts. 23 class ChainedDiagnosticConsumer : public DiagnosticConsumer { 24 virtual void anchor(); 25 std::unique_ptr<DiagnosticConsumer> OwningPrimary; 26 DiagnosticConsumer *Primary; 27 std::unique_ptr<DiagnosticConsumer> Secondary; 28 29 public: ChainedDiagnosticConsumer(std::unique_ptr<DiagnosticConsumer> Primary,std::unique_ptr<DiagnosticConsumer> Secondary)30 ChainedDiagnosticConsumer(std::unique_ptr<DiagnosticConsumer> Primary, 31 std::unique_ptr<DiagnosticConsumer> Secondary) 32 : OwningPrimary(std::move(Primary)), Primary(OwningPrimary.get()), 33 Secondary(std::move(Secondary)) {} 34 35 /// \brief Construct without taking ownership of \c Primary. ChainedDiagnosticConsumer(DiagnosticConsumer * Primary,std::unique_ptr<DiagnosticConsumer> Secondary)36 ChainedDiagnosticConsumer(DiagnosticConsumer *Primary, 37 std::unique_ptr<DiagnosticConsumer> Secondary) 38 : Primary(Primary), Secondary(std::move(Secondary)) {} 39 BeginSourceFile(const LangOptions & LO,const Preprocessor * PP)40 void BeginSourceFile(const LangOptions &LO, 41 const Preprocessor *PP) override { 42 Primary->BeginSourceFile(LO, PP); 43 Secondary->BeginSourceFile(LO, PP); 44 } 45 EndSourceFile()46 void EndSourceFile() override { 47 Secondary->EndSourceFile(); 48 Primary->EndSourceFile(); 49 } 50 finish()51 void finish() override { 52 Secondary->finish(); 53 Primary->finish(); 54 } 55 IncludeInDiagnosticCounts()56 bool IncludeInDiagnosticCounts() const override { 57 return Primary->IncludeInDiagnosticCounts(); 58 } 59 HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,const Diagnostic & Info)60 void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, 61 const Diagnostic &Info) override { 62 // Default implementation (Warnings/errors count). 63 DiagnosticConsumer::HandleDiagnostic(DiagLevel, Info); 64 65 Primary->HandleDiagnostic(DiagLevel, Info); 66 Secondary->HandleDiagnostic(DiagLevel, Info); 67 } 68 }; 69 70 } // end namspace clang 71 72 #endif 73