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