//===--- LogDiagnosticPrinter.h - Log 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 // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_FRONTEND_LOGDIAGNOSTICPRINTER_H #define LLVM_CLANG_FRONTEND_LOGDIAGNOSTICPRINTER_H #include "clang/Basic/Diagnostic.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" namespace clang { class DiagnosticOptions; class LangOptions; class LogDiagnosticPrinter : public DiagnosticConsumer { struct DiagEntry { /// The primary message line of the diagnostic. std::string Message; /// The source file name, if available. std::string Filename; /// The source file line number, if available. unsigned Line; /// The source file column number, if available. unsigned Column; /// The ID of the diagnostic. unsigned DiagnosticID; /// The Option Flag for the diagnostic std::string WarningOption; /// The level of the diagnostic. DiagnosticsEngine::Level DiagnosticLevel; }; void EmitDiagEntry(llvm::raw_ostream &OS, const LogDiagnosticPrinter::DiagEntry &DE); // Conditional ownership (when StreamOwner is non-null, it's keeping OS // alive). We might want to replace this with a wrapper for conditional // ownership eventually - it seems to pop up often enough. raw_ostream &OS; std::unique_ptr StreamOwner; const LangOptions *LangOpts; IntrusiveRefCntPtr DiagOpts; SourceLocation LastWarningLoc; FullSourceLoc LastLoc; SmallVector Entries; std::string MainFilename; std::string DwarfDebugFlags; public: LogDiagnosticPrinter(raw_ostream &OS, DiagnosticOptions *Diags, std::unique_ptr StreamOwner); void setDwarfDebugFlags(StringRef Value) { DwarfDebugFlags = Value; } void BeginSourceFile(const LangOptions &LO, const Preprocessor *PP) override { LangOpts = &LO; } void EndSourceFile() override; void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) override; }; } // end namespace clang #endif