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