DiagnosticManager.h revision 304274
1139823Simp//===-- DiagnosticManager.h -------------------------------------*- C++ -*-===// 21541Srgrimes// 31541Srgrimes// The LLVM Compiler Infrastructure 41541Srgrimes// 51541Srgrimes// This file is distributed under the University of Illinois Open Source 61541Srgrimes// License. See LICENSE.TXT for details. 71541Srgrimes// 81541Srgrimes//===----------------------------------------------------------------------===// 91541Srgrimes 101541Srgrimes#ifndef lldb_DiagnosticManager_h 111541Srgrimes#define lldb_DiagnosticManager_h 121541Srgrimes 131541Srgrimes#include "lldb/lldb-defines.h" 141541Srgrimes#include "lldb/lldb-types.h" 151541Srgrimes 161541Srgrimes#include <string> 171541Srgrimes#include <vector> 181541Srgrimes 191541Srgrimesnamespace lldb_private 201541Srgrimes{ 211541Srgrimes 221541Srgrimesenum DiagnosticOrigin 231541Srgrimes{ 241541Srgrimes eDiagnosticOriginUnknown = 0, 251541Srgrimes eDiagnosticOriginLLDB, 261541Srgrimes eDiagnosticOriginClang, 271541Srgrimes eDiagnosticOriginGo, 281541Srgrimes eDiagnosticOriginSwift, 291541Srgrimes eDiagnosticOriginLLVM 301541Srgrimes}; 311541Srgrimes 32172467Ssilbyenum DiagnosticSeverity 33172467Ssilby{ 34172467Ssilby eDiagnosticSeverityError, 351541Srgrimes eDiagnosticSeverityWarning, 361541Srgrimes eDiagnosticSeverityRemark 371541Srgrimes}; 381541Srgrimes 391541Srgrimesconst uint32_t LLDB_INVALID_COMPILER_ID = UINT32_MAX; 401541Srgrimes 411541Srgrimesclass Diagnostic 421541Srgrimes{ 431541Srgrimesfriend class DiagnosticManager; 441541Srgrimes 451541Srgrimespublic: 461541Srgrimes DiagnosticOrigin getKind() const { return m_origin; } 471541Srgrimes 481541Srgrimes static bool classof(const Diagnostic *diag) 49169454Srwatson { 501541Srgrimes DiagnosticOrigin kind = diag->getKind(); 511541Srgrimes switch (kind) 521541Srgrimes { 531541Srgrimes case eDiagnosticOriginUnknown: 541541Srgrimes case eDiagnosticOriginLLDB: 551541Srgrimes case eDiagnosticOriginGo: 561541Srgrimes case eDiagnosticOriginLLVM: 571541Srgrimes return true; 581541Srgrimes case eDiagnosticOriginClang: 591541Srgrimes case eDiagnosticOriginSwift: 601541Srgrimes return false; 611541Srgrimes } 621541Srgrimes } 631541Srgrimes 641541Srgrimes Diagnostic(const char *message, DiagnosticSeverity severity, DiagnosticOrigin origin, uint32_t compiler_id) : 651541Srgrimes m_message(message), 661541Srgrimes m_severity(severity), 671541Srgrimes m_origin(origin), 681541Srgrimes m_compiler_id(compiler_id) 691541Srgrimes { 701541Srgrimes } 711541Srgrimes 721541Srgrimes Diagnostic(const Diagnostic &rhs) : 731541Srgrimes m_message(rhs.m_message), 741541Srgrimes m_severity(rhs.m_severity), 758876Srgrimes m_origin(rhs.m_origin), 761541Srgrimes m_compiler_id(rhs.m_compiler_id) 771541Srgrimes { 781541Srgrimes } 791541Srgrimes 801541Srgrimes virtual ~Diagnostic() = default; 811541Srgrimes 821541Srgrimes virtual bool HasFixIts () const { return false; } 831541Srgrimes 841541Srgrimes DiagnosticSeverity 851541Srgrimes GetSeverity() const 861541Srgrimes { 871541Srgrimes return m_severity; 881541Srgrimes } 891541Srgrimes 901541Srgrimes uint32_t 91238941Sluigi GetCompilerID() const 921541Srgrimes { 931541Srgrimes return m_compiler_id; 941541Srgrimes } 951541Srgrimes 961541Srgrimes const char * 971541Srgrimes GetMessage() const 981541Srgrimes { 991541Srgrimes return m_message.c_str(); 1001541Srgrimes } 1011541Srgrimes 1021541Srgrimes void AppendMessage(const char *message, bool precede_with_newline = true) 1031541Srgrimes { 1041541Srgrimes if (precede_with_newline) 1051541Srgrimes m_message.push_back('\n'); 1061541Srgrimes m_message.append(message); 1071541Srgrimes } 1081541Srgrimes 1091541Srgrimesprotected: 1101541Srgrimes std::string m_message; 1111541Srgrimes DiagnosticSeverity m_severity; 1121541Srgrimes DiagnosticOrigin m_origin; 1131541Srgrimes uint32_t m_compiler_id; // Compiler-specific diagnostic ID 1141541Srgrimes}; 1151541Srgrimes 1161541Srgrimestypedef std::vector<Diagnostic *> DiagnosticList; 1171541Srgrimes 1181541Srgrimesclass DiagnosticManager 1191541Srgrimes{ 1201541Srgrimespublic: 1211541Srgrimes void 1221541Srgrimes Clear() 1231541Srgrimes { 1241541Srgrimes m_diagnostics.clear(); 1251541Srgrimes m_fixed_expression.clear(); 1261541Srgrimes } 1271541Srgrimes 1281541Srgrimes // The diagnostic manager holds a list of diagnostics, which are owned by the manager. 1291541Srgrimes const DiagnosticList & 1301541Srgrimes Diagnostics() 1311541Srgrimes { 1321541Srgrimes return m_diagnostics; 1331541Srgrimes } 1341541Srgrimes 1351541Srgrimes ~DiagnosticManager() 1361541Srgrimes { 1371541Srgrimes for (Diagnostic *diag : m_diagnostics) 1381541Srgrimes { 1391541Srgrimes delete diag; 1401541Srgrimes } 1411541Srgrimes } 1421541Srgrimes 1431541Srgrimes bool 1441541Srgrimes HasFixIts() 1451541Srgrimes { 1461541Srgrimes for (Diagnostic *diag : m_diagnostics) 147 { 148 if (diag->HasFixIts()) 149 return true; 150 } 151 return false; 152 } 153 154 void 155 AddDiagnostic(const char *message, DiagnosticSeverity severity, DiagnosticOrigin origin, 156 uint32_t compiler_id = LLDB_INVALID_COMPILER_ID) 157 { 158 m_diagnostics.push_back(new Diagnostic(message, severity, origin, compiler_id)); 159 } 160 161 void 162 AddDiagnostic(Diagnostic *diagnostic) 163 { 164 m_diagnostics.push_back(diagnostic); 165 } 166 167 size_t 168 Printf(DiagnosticSeverity severity, const char *format, ...) __attribute__((format(printf, 3, 4))); 169 size_t 170 PutCString(DiagnosticSeverity severity, const char *cstr); 171 172 void 173 AppendMessageToDiagnostic(const char *cstr) 174 { 175 if (m_diagnostics.size()) 176 { 177 m_diagnostics.back()->AppendMessage(cstr); 178 } 179 } 180 181 // Returns a string containing errors in this format: 182 // 183 // "error: error text\n 184 // warning: warning text\n 185 // remark text\n" 186 std::string 187 GetString(char separator = '\n'); 188 189 void 190 Dump(Log *log); 191 192 const std::string & 193 GetFixedExpression() 194 { 195 return m_fixed_expression; 196 } 197 198 // Moves fixed_expression to the internal storage. 199 void 200 SetFixedExpression(std::string fixed_expression) 201 { 202 m_fixed_expression = std::move(fixed_expression); 203 fixed_expression.clear(); 204 } 205 206protected: 207 DiagnosticList m_diagnostics; 208 std::string m_fixed_expression; 209}; 210} 211 212#endif /* lldb_DiagnosticManager_h */ 213