DiagnosticManager.h revision 360784
1251881Speter//===-- DiagnosticManager.h -------------------------------------*- C++ -*-===// 2251881Speter// 3251881Speter// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4251881Speter// See https://llvm.org/LICENSE.txt for license information. 5251881Speter// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6251881Speter// 7251881Speter//===----------------------------------------------------------------------===// 8251881Speter 9251881Speter#ifndef lldb_DiagnosticManager_h 10251881Speter#define lldb_DiagnosticManager_h 11251881Speter 12251881Speter#include "lldb/lldb-defines.h" 13251881Speter#include "lldb/lldb-types.h" 14251881Speter 15251881Speter#include "llvm/ADT/STLExtras.h" 16251881Speter#include "llvm/ADT/StringRef.h" 17251881Speter 18251881Speter#include <string> 19251881Speter#include <vector> 20251881Speter 21251881Speternamespace lldb_private { 22251881Speter 23251881Speterenum DiagnosticOrigin { 24251881Speter eDiagnosticOriginUnknown = 0, 25251881Speter eDiagnosticOriginLLDB, 26251881Speter eDiagnosticOriginClang, 27251881Speter eDiagnosticOriginSwift, 28251881Speter eDiagnosticOriginLLVM 29251881Speter}; 30251881Speter 31251881Speterenum DiagnosticSeverity { 32251881Speter eDiagnosticSeverityError, 33251881Speter eDiagnosticSeverityWarning, 34251881Speter eDiagnosticSeverityRemark 35251881Speter}; 36251881Speter 37251881Speterconst uint32_t LLDB_INVALID_COMPILER_ID = UINT32_MAX; 38251881Speter 39251881Speterclass Diagnostic { 40251881Speter friend class DiagnosticManager; 41251881Speter 42251881Speterpublic: 43251881Speter DiagnosticOrigin getKind() const { return m_origin; } 44251881Speter 45251881Speter static bool classof(const Diagnostic *diag) { 46251881Speter DiagnosticOrigin kind = diag->getKind(); 47251881Speter switch (kind) { 48251881Speter case eDiagnosticOriginUnknown: 49251881Speter case eDiagnosticOriginLLDB: 50251881Speter case eDiagnosticOriginLLVM: 51251881Speter return true; 52251881Speter case eDiagnosticOriginClang: 53251881Speter case eDiagnosticOriginSwift: 54251881Speter return false; 55251881Speter } 56251881Speter } 57251881Speter 58251881Speter Diagnostic(llvm::StringRef message, DiagnosticSeverity severity, 59251881Speter DiagnosticOrigin origin, uint32_t compiler_id) 60251881Speter : m_message(message), m_severity(severity), m_origin(origin), 61251881Speter m_compiler_id(compiler_id) {} 62251881Speter 63251881Speter Diagnostic(const Diagnostic &rhs) 64251881Speter : m_message(rhs.m_message), m_severity(rhs.m_severity), 65251881Speter m_origin(rhs.m_origin), m_compiler_id(rhs.m_compiler_id) {} 66251881Speter 67251881Speter virtual ~Diagnostic() = default; 68251881Speter 69251881Speter virtual bool HasFixIts() const { return false; } 70251881Speter 71251881Speter DiagnosticSeverity GetSeverity() const { return m_severity; } 72251881Speter 73251881Speter uint32_t GetCompilerID() const { return m_compiler_id; } 74251881Speter 75251881Speter llvm::StringRef GetMessage() const { return m_message; } 76251881Speter 77251881Speter void AppendMessage(llvm::StringRef message, 78251881Speter bool precede_with_newline = true) { 79251881Speter if (precede_with_newline) 80251881Speter m_message.push_back('\n'); 81251881Speter m_message.append(message); 82251881Speter } 83251881Speter 84251881Speterprotected: 85251881Speter std::string m_message; 86251881Speter DiagnosticSeverity m_severity; 87251881Speter DiagnosticOrigin m_origin; 88251881Speter uint32_t m_compiler_id; // Compiler-specific diagnostic ID 89251881Speter}; 90251881Speter 91251881Spetertypedef std::vector<std::unique_ptr<Diagnostic>> DiagnosticList; 92251881Speter 93251881Speterclass DiagnosticManager { 94251881Speterpublic: 95251881Speter void Clear() { 96251881Speter m_diagnostics.clear(); 97251881Speter m_fixed_expression.clear(); 98251881Speter } 99251881Speter 100251881Speter const DiagnosticList &Diagnostics() { return m_diagnostics; } 101251881Speter 102251881Speter bool HasFixIts() const { 103251881Speter return llvm::any_of(m_diagnostics, 104251881Speter [](const std::unique_ptr<Diagnostic> &diag) { 105251881Speter return diag->HasFixIts(); 106251881Speter }); 107251881Speter } 108251881Speter 109251881Speter void AddDiagnostic(llvm::StringRef message, DiagnosticSeverity severity, 110251881Speter DiagnosticOrigin origin, 111251881Speter uint32_t compiler_id = LLDB_INVALID_COMPILER_ID) { 112251881Speter m_diagnostics.emplace_back( 113251881Speter std::make_unique<Diagnostic>(message, severity, origin, compiler_id)); 114251881Speter } 115251881Speter 116251881Speter void AddDiagnostic(std::unique_ptr<Diagnostic> diagnostic) { 117251881Speter m_diagnostics.push_back(std::move(diagnostic)); 118251881Speter } 119251881Speter 120251881Speter size_t Printf(DiagnosticSeverity severity, const char *format, ...) 121251881Speter __attribute__((format(printf, 3, 4))); 122251881Speter void PutString(DiagnosticSeverity severity, llvm::StringRef str); 123251881Speter 124251881Speter void AppendMessageToDiagnostic(llvm::StringRef str) { 125251881Speter if (!m_diagnostics.empty()) 126251881Speter m_diagnostics.back()->AppendMessage(str); 127251881Speter } 128251881Speter 129251881Speter // Returns a string containing errors in this format: 130251881Speter // 131251881Speter // "error: error text\n 132251881Speter // warning: warning text\n 133251881Speter // remark text\n" 134251881Speter std::string GetString(char separator = '\n'); 135251881Speter 136251881Speter void Dump(Log *log); 137251881Speter 138251881Speter const std::string &GetFixedExpression() { return m_fixed_expression; } 139251881Speter 140251881Speter // Moves fixed_expression to the internal storage. 141251881Speter void SetFixedExpression(std::string fixed_expression) { 142251881Speter m_fixed_expression = std::move(fixed_expression); 143251881Speter } 144251881Speter 145251881Speterprotected: 146251881Speter DiagnosticList m_diagnostics; 147251881Speter std::string m_fixed_expression; 148251881Speter}; 149251881Speter} 150251881Speter 151251881Speter#endif /* lldb_DiagnosticManager_h */ 152251881Speter