1 //===--- LogDiagnosticPrinter.h - Log Diagnostic Client ---------*- 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_LOGDIAGNOSTICPRINTER_H 11 #define LLVM_CLANG_FRONTEND_LOGDIAGNOSTICPRINTER_H 12 13 #include "clang/Basic/Diagnostic.h" 14 #include "clang/Basic/SourceLocation.h" 15 #include "llvm/ADT/SmallVector.h" 16 #include "llvm/ADT/StringRef.h" 17 18 namespace clang { 19 class DiagnosticOptions; 20 class LangOptions; 21 22 class LogDiagnosticPrinter : public DiagnosticConsumer { 23 struct DiagEntry { 24 /// The primary message line of the diagnostic. 25 std::string Message; 26 27 /// The source file name, if available. 28 std::string Filename; 29 30 /// The source file line number, if available. 31 unsigned Line; 32 33 /// The source file column number, if available. 34 unsigned Column; 35 36 /// The ID of the diagnostic. 37 unsigned DiagnosticID; 38 39 /// The Option Flag for the diagnostic 40 std::string WarningOption; 41 42 /// The level of the diagnostic. 43 DiagnosticsEngine::Level DiagnosticLevel; 44 }; 45 46 void EmitDiagEntry(llvm::raw_ostream &OS, 47 const LogDiagnosticPrinter::DiagEntry &DE); 48 49 // Conditional ownership (when StreamOwner is non-null, it's keeping OS 50 // alive). We might want to replace this with a wrapper for conditional 51 // ownership eventually - it seems to pop up often enough. 52 raw_ostream &OS; 53 std::unique_ptr<raw_ostream> StreamOwner; 54 const LangOptions *LangOpts; 55 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts; 56 57 SourceLocation LastWarningLoc; 58 FullSourceLoc LastLoc; 59 60 SmallVector<DiagEntry, 8> Entries; 61 62 std::string MainFilename; 63 std::string DwarfDebugFlags; 64 65 public: 66 LogDiagnosticPrinter(raw_ostream &OS, DiagnosticOptions *Diags, 67 std::unique_ptr<raw_ostream> StreamOwner); 68 69 void setDwarfDebugFlags(StringRef Value) { 70 DwarfDebugFlags = Value; 71 } 72 73 void BeginSourceFile(const LangOptions &LO, const Preprocessor *PP) override { 74 LangOpts = &LO; 75 } 76 77 void EndSourceFile() override; 78 79 void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, 80 const Diagnostic &Info) override; 81 }; 82 83 } // end namespace clang 84 85 #endif 86