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