1//===-- CommandReturnObject.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
9#ifndef LLDB_INTERPRETER_COMMANDRETURNOBJECT_H
10#define LLDB_INTERPRETER_COMMANDRETURNOBJECT_H
11
12#include "lldb/Host/StreamFile.h"
13#include "lldb/Utility/StreamString.h"
14#include "lldb/Utility/StreamTee.h"
15#include "lldb/lldb-private.h"
16
17#include "llvm/ADT/StringRef.h"
18#include "llvm/Support/Error.h"
19#include "llvm/Support/FormatVariadic.h"
20#include "llvm/Support/WithColor.h"
21
22#include <memory>
23
24namespace lldb_private {
25
26class CommandReturnObject {
27public:
28 CommandReturnObject(bool colors);
29
30 ~CommandReturnObject() = default;
31
32 llvm::StringRef GetOutputData() {
33 lldb::StreamSP stream_sp(m_out_stream.GetStreamAtIndex(idx: eStreamStringIndex));
34 if (stream_sp)
35 return std::static_pointer_cast<StreamString>(r: stream_sp)->GetString();
36 return llvm::StringRef();
37 }
38
39 llvm::StringRef GetErrorData() {
40 lldb::StreamSP stream_sp(m_err_stream.GetStreamAtIndex(idx: eStreamStringIndex));
41 if (stream_sp)
42 return std::static_pointer_cast<StreamString>(r: stream_sp)->GetString();
43 return llvm::StringRef();
44 }
45
46 Stream &GetOutputStream() {
47 // Make sure we at least have our normal string stream output stream
48 lldb::StreamSP stream_sp(m_out_stream.GetStreamAtIndex(idx: eStreamStringIndex));
49 if (!stream_sp) {
50 stream_sp = std::make_shared<StreamString>();
51 m_out_stream.SetStreamAtIndex(idx: eStreamStringIndex, stream_sp);
52 }
53 return m_out_stream;
54 }
55
56 Stream &GetErrorStream() {
57 // Make sure we at least have our normal string stream output stream
58 lldb::StreamSP stream_sp(m_err_stream.GetStreamAtIndex(idx: eStreamStringIndex));
59 if (!stream_sp) {
60 stream_sp = std::make_shared<StreamString>();
61 m_err_stream.SetStreamAtIndex(idx: eStreamStringIndex, stream_sp);
62 }
63 return m_err_stream;
64 }
65
66 void SetImmediateOutputFile(lldb::FileSP file_sp) {
67 if (m_suppress_immediate_output)
68 return;
69 lldb::StreamSP stream_sp(new StreamFile(file_sp));
70 m_out_stream.SetStreamAtIndex(idx: eImmediateStreamIndex, stream_sp);
71 }
72
73 void SetImmediateErrorFile(lldb::FileSP file_sp) {
74 if (m_suppress_immediate_output)
75 return;
76 lldb::StreamSP stream_sp(new StreamFile(file_sp));
77 m_err_stream.SetStreamAtIndex(idx: eImmediateStreamIndex, stream_sp);
78 }
79
80 void SetImmediateOutputStream(const lldb::StreamSP &stream_sp) {
81 if (m_suppress_immediate_output)
82 return;
83 m_out_stream.SetStreamAtIndex(idx: eImmediateStreamIndex, stream_sp);
84 }
85
86 void SetImmediateErrorStream(const lldb::StreamSP &stream_sp) {
87 if (m_suppress_immediate_output)
88 return;
89 m_err_stream.SetStreamAtIndex(idx: eImmediateStreamIndex, stream_sp);
90 }
91
92 lldb::StreamSP GetImmediateOutputStream() {
93 return m_out_stream.GetStreamAtIndex(idx: eImmediateStreamIndex);
94 }
95
96 lldb::StreamSP GetImmediateErrorStream() {
97 return m_err_stream.GetStreamAtIndex(idx: eImmediateStreamIndex);
98 }
99
100 void Clear();
101
102 void AppendMessage(llvm::StringRef in_string);
103
104 void AppendMessageWithFormat(const char *format, ...)
105 __attribute__((format(printf, 2, 3)));
106
107 void AppendWarning(llvm::StringRef in_string);
108
109 void AppendWarningWithFormat(const char *format, ...)
110 __attribute__((format(printf, 2, 3)));
111
112 void AppendError(llvm::StringRef in_string);
113
114 void AppendRawError(llvm::StringRef in_string);
115
116 void AppendErrorWithFormat(const char *format, ...)
117 __attribute__((format(printf, 2, 3)));
118
119 template <typename... Args>
120 void AppendMessageWithFormatv(const char *format, Args &&... args) {
121 AppendMessage(in_string: llvm::formatv(format, std::forward<Args>(args)...).str());
122 }
123
124 template <typename... Args>
125 void AppendWarningWithFormatv(const char *format, Args &&... args) {
126 AppendWarning(in_string: llvm::formatv(format, std::forward<Args>(args)...).str());
127 }
128
129 template <typename... Args>
130 void AppendErrorWithFormatv(const char *format, Args &&... args) {
131 AppendError(in_string: llvm::formatv(format, std::forward<Args>(args)...).str());
132 }
133
134 void SetError(const Status &error, const char *fallback_error_cstr = nullptr);
135
136 void SetError(llvm::Error error);
137
138 lldb::ReturnStatus GetStatus() const;
139
140 void SetStatus(lldb::ReturnStatus status);
141
142 bool Succeeded() const;
143
144 bool HasResult() const;
145
146 bool GetDidChangeProcessState() const;
147
148 void SetDidChangeProcessState(bool b);
149
150 bool GetInteractive() const;
151
152 void SetInteractive(bool b);
153
154 bool GetSuppressImmediateOutput() const;
155
156 void SetSuppressImmediateOutput(bool b);
157
158private:
159 enum { eStreamStringIndex = 0, eImmediateStreamIndex = 1 };
160
161 StreamTee m_out_stream;
162 StreamTee m_err_stream;
163
164 lldb::ReturnStatus m_status = lldb::eReturnStatusStarted;
165
166 bool m_did_change_process_state = false;
167 bool m_suppress_immediate_output = false;
168
169 /// If true, then the input handle from the debugger will be hooked up.
170 bool m_interactive = true;
171};
172
173} // namespace lldb_private
174
175#endif // LLDB_INTERPRETER_COMMANDRETURNOBJECT_H
176

source code of lldb/include/lldb/Interpreter/CommandReturnObject.h