1 //===- TextDiagnosticBuffer.h - Buffer Text Diagnostics ---------*- 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 // This is a concrete diagnostic client, which buffers the diagnostic messages.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_FRONTEND_TEXTDIAGNOSTICBUFFER_H
15 #define LLVM_CLANG_FRONTEND_TEXTDIAGNOSTICBUFFER_H
16 
17 #include "clang/Basic/Diagnostic.h"
18 #include "clang/Basic/SourceLocation.h"
19 #include <cstddef>
20 #include <string>
21 #include <utility>
22 #include <vector>
23 
24 namespace clang {
25 
26 class TextDiagnosticBuffer : public DiagnosticConsumer {
27 public:
28   using DiagList = std::vector<std::pair<SourceLocation, std::string>>;
29   using iterator = DiagList::iterator;
30   using const_iterator = DiagList::const_iterator;
31 
32 private:
33   DiagList Errors, Warnings, Remarks, Notes;
34 
35   /// All - All diagnostics in the order in which they were generated.  That
36   /// order likely doesn't correspond to user input order, but it at least
37   /// keeps notes in the right places.  Each pair in the vector is a diagnostic
38   /// level and an index into the corresponding DiagList above.
39   std::vector<std::pair<DiagnosticsEngine::Level, size_t>> All;
40 
41 public:
err_begin()42   const_iterator err_begin() const { return Errors.begin(); }
err_end()43   const_iterator err_end() const { return Errors.end(); }
44 
warn_begin()45   const_iterator warn_begin() const { return Warnings.begin(); }
warn_end()46   const_iterator warn_end() const { return Warnings.end(); }
47 
remark_begin()48   const_iterator remark_begin() const { return Remarks.begin(); }
remark_end()49   const_iterator remark_end() const { return Remarks.end(); }
50 
note_begin()51   const_iterator note_begin() const { return Notes.begin(); }
note_end()52   const_iterator note_end() const { return Notes.end(); }
53 
54   void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
55                         const Diagnostic &Info) override;
56 
57   /// FlushDiagnostics - Flush the buffered diagnostics to an given
58   /// diagnostic engine.
59   void FlushDiagnostics(DiagnosticsEngine &Diags) const;
60 };
61 
62 } // namespace clang
63 
64 #endif // LLVM_CLANG_FRONTEND_TEXTDIAGNOSTICBUFFER_H
65