DiagnosticManager.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. //===-- DiagnosticManager.h -------------------------------------*- 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. #ifndef LLDB_EXPRESSION_DIAGNOSTICMANAGER_H
  9. #define LLDB_EXPRESSION_DIAGNOSTICMANAGER_H
  10. #include "lldb/lldb-defines.h"
  11. #include "lldb/lldb-types.h"
  12. #include "llvm/ADT/STLExtras.h"
  13. #include "llvm/ADT/StringRef.h"
  14. #include <string>
  15. #include <vector>
  16. namespace lldb_private {
  17. enum DiagnosticOrigin {
  18. eDiagnosticOriginUnknown = 0,
  19. eDiagnosticOriginLLDB,
  20. eDiagnosticOriginClang,
  21. eDiagnosticOriginSwift,
  22. eDiagnosticOriginLLVM
  23. };
  24. enum DiagnosticSeverity {
  25. eDiagnosticSeverityError,
  26. eDiagnosticSeverityWarning,
  27. eDiagnosticSeverityRemark
  28. };
  29. const uint32_t LLDB_INVALID_COMPILER_ID = UINT32_MAX;
  30. class Diagnostic {
  31. friend class DiagnosticManager;
  32. public:
  33. DiagnosticOrigin getKind() const { return m_origin; }
  34. static bool classof(const Diagnostic *diag) {
  35. DiagnosticOrigin kind = diag->getKind();
  36. switch (kind) {
  37. case eDiagnosticOriginUnknown:
  38. case eDiagnosticOriginLLDB:
  39. case eDiagnosticOriginLLVM:
  40. return true;
  41. case eDiagnosticOriginClang:
  42. case eDiagnosticOriginSwift:
  43. return false;
  44. }
  45. }
  46. Diagnostic(llvm::StringRef message, DiagnosticSeverity severity,
  47. DiagnosticOrigin origin, uint32_t compiler_id)
  48. : m_message(message), m_severity(severity), m_origin(origin),
  49. m_compiler_id(compiler_id) {}
  50. Diagnostic(const Diagnostic &rhs)
  51. : m_message(rhs.m_message), m_severity(rhs.m_severity),
  52. m_origin(rhs.m_origin), m_compiler_id(rhs.m_compiler_id) {}
  53. virtual ~Diagnostic() = default;
  54. virtual bool HasFixIts() const { return false; }
  55. DiagnosticSeverity GetSeverity() const { return m_severity; }
  56. uint32_t GetCompilerID() const { return m_compiler_id; }
  57. llvm::StringRef GetMessage() const { return m_message; }
  58. void AppendMessage(llvm::StringRef message,
  59. bool precede_with_newline = true) {
  60. if (precede_with_newline)
  61. m_message.push_back('\n');
  62. m_message += message;
  63. }
  64. protected:
  65. std::string m_message;
  66. DiagnosticSeverity m_severity;
  67. DiagnosticOrigin m_origin;
  68. uint32_t m_compiler_id; // Compiler-specific diagnostic ID
  69. };
  70. typedef std::vector<std::unique_ptr<Diagnostic>> DiagnosticList;
  71. class DiagnosticManager {
  72. public:
  73. void Clear() {
  74. m_diagnostics.clear();
  75. m_fixed_expression.clear();
  76. }
  77. const DiagnosticList &Diagnostics() { return m_diagnostics; }
  78. bool HasFixIts() const {
  79. return llvm::any_of(m_diagnostics,
  80. [](const std::unique_ptr<Diagnostic> &diag) {
  81. return diag->HasFixIts();
  82. });
  83. }
  84. void AddDiagnostic(llvm::StringRef message, DiagnosticSeverity severity,
  85. DiagnosticOrigin origin,
  86. uint32_t compiler_id = LLDB_INVALID_COMPILER_ID) {
  87. m_diagnostics.emplace_back(
  88. std::make_unique<Diagnostic>(message, severity, origin, compiler_id));
  89. }
  90. void AddDiagnostic(std::unique_ptr<Diagnostic> diagnostic) {
  91. m_diagnostics.push_back(std::move(diagnostic));
  92. }
  93. size_t Printf(DiagnosticSeverity severity, const char *format, ...)
  94. __attribute__((format(printf, 3, 4)));
  95. void PutString(DiagnosticSeverity severity, llvm::StringRef str);
  96. void AppendMessageToDiagnostic(llvm::StringRef str) {
  97. if (!m_diagnostics.empty())
  98. m_diagnostics.back()->AppendMessage(str);
  99. }
  100. // Returns a string containing errors in this format:
  101. //
  102. // "error: error text\n
  103. // warning: warning text\n
  104. // remark text\n"
  105. std::string GetString(char separator = '\n');
  106. void Dump(Log *log);
  107. const std::string &GetFixedExpression() { return m_fixed_expression; }
  108. // Moves fixed_expression to the internal storage.
  109. void SetFixedExpression(std::string fixed_expression) {
  110. m_fixed_expression = std::move(fixed_expression);
  111. }
  112. protected:
  113. DiagnosticList m_diagnostics;
  114. std::string m_fixed_expression;
  115. };
  116. }
  117. #endif // LLDB_EXPRESSION_DIAGNOSTICMANAGER_H