| //===-- SARIFDiagnosticPrinter.h - SARIF Diagnostic Client -------*- C++-*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This is a concrete diagnostic client, which prints the diagnostics to |
| // standard error in SARIF format. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_CLANG_FRONTEND_SARIFDIAGNOSTICPRINTER_H |
| #define LLVM_CLANG_FRONTEND_SARIFDIAGNOSTICPRINTER_H |
| |
| #include "clang/Basic/Diagnostic.h" |
| #include "clang/Basic/LLVM.h" |
| #include "clang/Basic/Sarif.h" |
| #include "llvm/ADT/IntrusiveRefCntPtr.h" |
| #include "llvm/ADT/StringRef.h" |
| #include <memory> |
| |
| namespace clang { |
| class DiagnosticOptions; |
| class LangOptions; |
| class SARIFDiagnostic; |
| class SarifDocumentWriter; |
| |
| class SARIFDiagnosticPrinter : public DiagnosticConsumer { |
| public: |
| SARIFDiagnosticPrinter(raw_ostream &OS, DiagnosticOptions *Diags); |
| ~SARIFDiagnosticPrinter() = default; |
| |
| SARIFDiagnosticPrinter &operator=(const SARIFDiagnosticPrinter &&) = delete; |
| SARIFDiagnosticPrinter(SARIFDiagnosticPrinter &&) = delete; |
| SARIFDiagnosticPrinter &operator=(const SARIFDiagnosticPrinter &) = delete; |
| SARIFDiagnosticPrinter(const SARIFDiagnosticPrinter &) = delete; |
| |
| /// setPrefix - Set the diagnostic printer prefix string, which will be |
| /// printed at the start of any diagnostics. If empty, no prefix string is |
| /// used. |
| void setPrefix(llvm::StringRef Value) { Prefix = Value; } |
| |
| bool hasSarifWriter() const { return Writer != nullptr; } |
| |
| SarifDocumentWriter &getSarifWriter() const { |
| assert(Writer && "SarifWriter not set!"); |
| return *Writer; |
| } |
| |
| void setSarifWriter(std::unique_ptr<SarifDocumentWriter> SarifWriter) { |
| Writer = std::move(SarifWriter); |
| } |
| |
| void BeginSourceFile(const LangOptions &LO, const Preprocessor *PP) override; |
| void EndSourceFile() override; |
| void HandleDiagnostic(DiagnosticsEngine::Level Level, |
| const Diagnostic &Info) override; |
| |
| private: |
| raw_ostream &OS; |
| IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts; |
| |
| /// Handle to the currently active SARIF diagnostic emitter. |
| std::unique_ptr<SARIFDiagnostic> SARIFDiag; |
| |
| /// A string to prefix to error messages. |
| std::string Prefix; |
| |
| std::unique_ptr<SarifDocumentWriter> Writer; |
| }; |
| |
| } // end namespace clang |
| |
| #endif |