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