181ad6265SDimitry Andric //===-- DebuggerEvents.h ----------------------------------------*- C++ -*-===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric 
9bdd1243dSDimitry Andric #include "lldb/Core/ModuleSpec.h"
1081ad6265SDimitry Andric #include "lldb/Utility/Event.h"
1106c3fb27SDimitry Andric #include "lldb/Utility/StructuredData.h"
1281ad6265SDimitry Andric 
1381ad6265SDimitry Andric #include <string>
1481ad6265SDimitry Andric 
1581ad6265SDimitry Andric #ifndef LLDB_CORE_DEBUGGER_EVENTS_H
1681ad6265SDimitry Andric #define LLDB_CORE_DEBUGGER_EVENTS_H
1781ad6265SDimitry Andric 
1881ad6265SDimitry Andric namespace lldb_private {
1981ad6265SDimitry Andric class Stream;
2081ad6265SDimitry Andric 
2181ad6265SDimitry Andric class ProgressEventData : public EventData {
2281ad6265SDimitry Andric public:
ProgressEventData(uint64_t progress_id,std::string title,std::string details,uint64_t completed,uint64_t total,bool debugger_specific)23*7a6dacacSDimitry Andric   ProgressEventData(uint64_t progress_id, std::string title,
24*7a6dacacSDimitry Andric                     std::string details, uint64_t completed, uint64_t total,
25*7a6dacacSDimitry Andric                     bool debugger_specific)
26*7a6dacacSDimitry Andric       : m_title(std::move(title)), m_details(std::move(details)),
2706c3fb27SDimitry Andric         m_id(progress_id), m_completed(completed), m_total(total),
2806c3fb27SDimitry Andric         m_debugger_specific(debugger_specific) {}
2981ad6265SDimitry Andric 
3006c3fb27SDimitry Andric   static llvm::StringRef GetFlavorString();
3181ad6265SDimitry Andric 
3206c3fb27SDimitry Andric   llvm::StringRef GetFlavor() const override;
3381ad6265SDimitry Andric 
3481ad6265SDimitry Andric   void Dump(Stream *s) const override;
3581ad6265SDimitry Andric 
3681ad6265SDimitry Andric   static const ProgressEventData *GetEventDataFromEvent(const Event *event_ptr);
3706c3fb27SDimitry Andric 
3806c3fb27SDimitry Andric   static StructuredData::DictionarySP
3906c3fb27SDimitry Andric   GetAsStructuredData(const Event *event_ptr);
4006c3fb27SDimitry Andric 
GetID()4181ad6265SDimitry Andric   uint64_t GetID() const { return m_id; }
IsFinite()4281ad6265SDimitry Andric   bool IsFinite() const { return m_total != UINT64_MAX; }
GetCompleted()4381ad6265SDimitry Andric   uint64_t GetCompleted() const { return m_completed; }
GetTotal()4481ad6265SDimitry Andric   uint64_t GetTotal() const { return m_total; }
GetMessage()4506c3fb27SDimitry Andric   std::string GetMessage() const {
4606c3fb27SDimitry Andric     std::string message = m_title;
4706c3fb27SDimitry Andric     if (!m_details.empty()) {
4806c3fb27SDimitry Andric       message.append(": ");
4906c3fb27SDimitry Andric       message.append(m_details);
5006c3fb27SDimitry Andric     }
5106c3fb27SDimitry Andric     return message;
5206c3fb27SDimitry Andric   }
GetTitle()5306c3fb27SDimitry Andric   const std::string &GetTitle() const { return m_title; }
GetDetails()5406c3fb27SDimitry Andric   const std::string &GetDetails() const { return m_details; }
IsDebuggerSpecific()5581ad6265SDimitry Andric   bool IsDebuggerSpecific() const { return m_debugger_specific; }
5681ad6265SDimitry Andric 
5781ad6265SDimitry Andric private:
5806c3fb27SDimitry Andric   /// The title of this progress event. The value is expected to remain stable
5906c3fb27SDimitry Andric   /// for a given progress ID.
6006c3fb27SDimitry Andric   std::string m_title;
6106c3fb27SDimitry Andric 
6206c3fb27SDimitry Andric   /// Details associated with this progress event update. The value is expected
6306c3fb27SDimitry Andric   /// to change between progress events.
6406c3fb27SDimitry Andric   std::string m_details;
6506c3fb27SDimitry Andric 
6606c3fb27SDimitry Andric   /// Unique ID used to associate progress events.
6781ad6265SDimitry Andric   const uint64_t m_id;
6806c3fb27SDimitry Andric 
6981ad6265SDimitry Andric   uint64_t m_completed;
7081ad6265SDimitry Andric   const uint64_t m_total;
7181ad6265SDimitry Andric   const bool m_debugger_specific;
7281ad6265SDimitry Andric   ProgressEventData(const ProgressEventData &) = delete;
7381ad6265SDimitry Andric   const ProgressEventData &operator=(const ProgressEventData &) = delete;
7481ad6265SDimitry Andric };
7581ad6265SDimitry Andric 
7681ad6265SDimitry Andric class DiagnosticEventData : public EventData {
7781ad6265SDimitry Andric public:
7881ad6265SDimitry Andric   enum class Type {
79bdd1243dSDimitry Andric     Info,
8081ad6265SDimitry Andric     Warning,
8181ad6265SDimitry Andric     Error,
8281ad6265SDimitry Andric   };
DiagnosticEventData(Type type,std::string message,bool debugger_specific)8381ad6265SDimitry Andric   DiagnosticEventData(Type type, std::string message, bool debugger_specific)
8481ad6265SDimitry Andric       : m_message(std::move(message)), m_type(type),
8581ad6265SDimitry Andric         m_debugger_specific(debugger_specific) {}
8681ad6265SDimitry Andric   ~DiagnosticEventData() override = default;
8781ad6265SDimitry Andric 
GetMessage()8881ad6265SDimitry Andric   const std::string &GetMessage() const { return m_message; }
IsDebuggerSpecific()8981ad6265SDimitry Andric   bool IsDebuggerSpecific() const { return m_debugger_specific; }
GetType()9081ad6265SDimitry Andric   Type GetType() const { return m_type; }
9181ad6265SDimitry Andric 
9281ad6265SDimitry Andric   llvm::StringRef GetPrefix() const;
9381ad6265SDimitry Andric 
9481ad6265SDimitry Andric   void Dump(Stream *s) const override;
9581ad6265SDimitry Andric 
9606c3fb27SDimitry Andric   static llvm::StringRef GetFlavorString();
9706c3fb27SDimitry Andric   llvm::StringRef GetFlavor() const override;
9881ad6265SDimitry Andric 
9981ad6265SDimitry Andric   static const DiagnosticEventData *
10081ad6265SDimitry Andric   GetEventDataFromEvent(const Event *event_ptr);
10181ad6265SDimitry Andric 
10206c3fb27SDimitry Andric   static StructuredData::DictionarySP
10306c3fb27SDimitry Andric   GetAsStructuredData(const Event *event_ptr);
10406c3fb27SDimitry Andric 
10581ad6265SDimitry Andric protected:
10681ad6265SDimitry Andric   std::string m_message;
10781ad6265SDimitry Andric   Type m_type;
10881ad6265SDimitry Andric   const bool m_debugger_specific;
10981ad6265SDimitry Andric 
11081ad6265SDimitry Andric   DiagnosticEventData(const DiagnosticEventData &) = delete;
11181ad6265SDimitry Andric   const DiagnosticEventData &operator=(const DiagnosticEventData &) = delete;
11281ad6265SDimitry Andric };
11381ad6265SDimitry Andric 
114bdd1243dSDimitry Andric class SymbolChangeEventData : public EventData {
115bdd1243dSDimitry Andric public:
SymbolChangeEventData(lldb::DebuggerWP debugger_wp,ModuleSpec module_spec)116bdd1243dSDimitry Andric   SymbolChangeEventData(lldb::DebuggerWP debugger_wp, ModuleSpec module_spec)
117bdd1243dSDimitry Andric       : m_debugger_wp(debugger_wp), m_module_spec(std::move(module_spec)) {}
118bdd1243dSDimitry Andric 
11906c3fb27SDimitry Andric   static llvm::StringRef GetFlavorString();
12006c3fb27SDimitry Andric   llvm::StringRef GetFlavor() const override;
121bdd1243dSDimitry Andric 
122bdd1243dSDimitry Andric   static const SymbolChangeEventData *
123bdd1243dSDimitry Andric   GetEventDataFromEvent(const Event *event_ptr);
124bdd1243dSDimitry Andric 
125bdd1243dSDimitry Andric   void DoOnRemoval(Event *event_ptr) override;
126bdd1243dSDimitry Andric 
127bdd1243dSDimitry Andric private:
128bdd1243dSDimitry Andric   lldb::DebuggerWP m_debugger_wp;
129bdd1243dSDimitry Andric   ModuleSpec m_module_spec;
130bdd1243dSDimitry Andric 
131bdd1243dSDimitry Andric   SymbolChangeEventData(const SymbolChangeEventData &) = delete;
132bdd1243dSDimitry Andric   const SymbolChangeEventData &
133bdd1243dSDimitry Andric   operator=(const SymbolChangeEventData &) = delete;
134bdd1243dSDimitry Andric };
135bdd1243dSDimitry Andric 
13681ad6265SDimitry Andric } // namespace lldb_private
13781ad6265SDimitry Andric 
13881ad6265SDimitry Andric #endif // LLDB_CORE_DEBUGGER_EVENTS_H
139