1 //===-- DiagnosticManager.h -------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef lldb_DiagnosticManager_h
11 #define lldb_DiagnosticManager_h
13 #include "lldb/lldb-defines.h"
14 #include "lldb/lldb-types.h"
16 #include "llvm/ADT/StringRef.h"
21 namespace lldb_private {
23 enum DiagnosticOrigin {
24 eDiagnosticOriginUnknown = 0,
25 eDiagnosticOriginLLDB,
26 eDiagnosticOriginClang,
28 eDiagnosticOriginSwift,
32 enum DiagnosticSeverity {
33 eDiagnosticSeverityError,
34 eDiagnosticSeverityWarning,
35 eDiagnosticSeverityRemark
38 const uint32_t LLDB_INVALID_COMPILER_ID = UINT32_MAX;
41 friend class DiagnosticManager;
44 DiagnosticOrigin getKind() const { return m_origin; }
46 static bool classof(const Diagnostic *diag) {
47 DiagnosticOrigin kind = diag->getKind();
49 case eDiagnosticOriginUnknown:
50 case eDiagnosticOriginLLDB:
51 case eDiagnosticOriginGo:
52 case eDiagnosticOriginLLVM:
54 case eDiagnosticOriginClang:
55 case eDiagnosticOriginSwift:
60 Diagnostic(llvm::StringRef message, DiagnosticSeverity severity,
61 DiagnosticOrigin origin, uint32_t compiler_id)
62 : m_message(message), m_severity(severity), m_origin(origin),
63 m_compiler_id(compiler_id) {}
65 Diagnostic(const Diagnostic &rhs)
66 : m_message(rhs.m_message), m_severity(rhs.m_severity),
67 m_origin(rhs.m_origin), m_compiler_id(rhs.m_compiler_id) {}
69 virtual ~Diagnostic() = default;
71 virtual bool HasFixIts() const { return false; }
73 DiagnosticSeverity GetSeverity() const { return m_severity; }
75 uint32_t GetCompilerID() const { return m_compiler_id; }
77 llvm::StringRef GetMessage() const { return m_message; }
79 void AppendMessage(llvm::StringRef message,
80 bool precede_with_newline = true) {
81 if (precede_with_newline)
82 m_message.push_back('\n');
83 m_message.append(message);
87 std::string m_message;
88 DiagnosticSeverity m_severity;
89 DiagnosticOrigin m_origin;
90 uint32_t m_compiler_id; // Compiler-specific diagnostic ID
93 typedef std::vector<Diagnostic *> DiagnosticList;
95 class DiagnosticManager {
98 m_diagnostics.clear();
99 m_fixed_expression.clear();
102 // The diagnostic manager holds a list of diagnostics, which are owned by the
104 const DiagnosticList &Diagnostics() { return m_diagnostics; }
106 ~DiagnosticManager() {
107 for (Diagnostic *diag : m_diagnostics) {
113 for (Diagnostic *diag : m_diagnostics) {
114 if (diag->HasFixIts())
120 void AddDiagnostic(llvm::StringRef message, DiagnosticSeverity severity,
121 DiagnosticOrigin origin,
122 uint32_t compiler_id = LLDB_INVALID_COMPILER_ID) {
123 m_diagnostics.push_back(
124 new Diagnostic(message, severity, origin, compiler_id));
127 void AddDiagnostic(Diagnostic *diagnostic) {
128 m_diagnostics.push_back(diagnostic);
131 void CopyDiagnostics(DiagnosticManager &otherDiagnostics);
133 size_t Printf(DiagnosticSeverity severity, const char *format, ...)
134 __attribute__((format(printf, 3, 4)));
135 size_t PutString(DiagnosticSeverity severity, llvm::StringRef str);
137 void AppendMessageToDiagnostic(llvm::StringRef str) {
138 if (!m_diagnostics.empty()) {
139 m_diagnostics.back()->AppendMessage(str);
143 // Returns a string containing errors in this format:
145 // "error: error text\n
146 // warning: warning text\n
148 std::string GetString(char separator = '\n');
152 const std::string &GetFixedExpression() { return m_fixed_expression; }
154 // Moves fixed_expression to the internal storage.
155 void SetFixedExpression(std::string fixed_expression) {
156 m_fixed_expression = std::move(fixed_expression);
157 fixed_expression.clear();
161 DiagnosticList m_diagnostics;
162 std::string m_fixed_expression;
166 #endif /* lldb_DiagnosticManager_h */