180814287SRaphael Isemann //===-- CommandReturnObject.cpp -------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner
930fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
1030fdc8d8SChris Lattner
1197206d57SZachary Turner #include "lldb/Utility/Status.h"
12bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
1330fdc8d8SChris Lattner
1430fdc8d8SChris Lattner using namespace lldb;
1530fdc8d8SChris Lattner using namespace lldb_private;
1630fdc8d8SChris Lattner
error(Stream & strm)17de019b88SJonas Devlieghere static llvm::raw_ostream &error(Stream &strm) {
18de019b88SJonas Devlieghere return llvm::WithColor(strm.AsRawOstream(), llvm::HighlightColor::Error,
19de019b88SJonas Devlieghere llvm::ColorMode::Enable)
20de019b88SJonas Devlieghere << "error: ";
21de019b88SJonas Devlieghere }
22de019b88SJonas Devlieghere
warning(Stream & strm)23de019b88SJonas Devlieghere static llvm::raw_ostream &warning(Stream &strm) {
24de019b88SJonas Devlieghere return llvm::WithColor(strm.AsRawOstream(), llvm::HighlightColor::Warning,
25de019b88SJonas Devlieghere llvm::ColorMode::Enable)
26de019b88SJonas Devlieghere << "warning: ";
27de019b88SJonas Devlieghere }
28de019b88SJonas Devlieghere
DumpStringToStreamWithNewline(Stream & strm,const std::string & s)29def72b91SJonas Devlieghere static void DumpStringToStreamWithNewline(Stream &strm, const std::string &s) {
30197bacffSGreg Clayton bool add_newline = false;
31def72b91SJonas Devlieghere if (!s.empty()) {
3205097246SAdrian Prantl // We already checked for empty above, now make sure there is a newline in
3305097246SAdrian Prantl // the error, and if there isn't one, add one.
34197bacffSGreg Clayton strm.Write(s.c_str(), s.size());
35197bacffSGreg Clayton
36197bacffSGreg Clayton const char last_char = *s.rbegin();
37197bacffSGreg Clayton add_newline = last_char != '\n' && last_char != '\r';
38197bacffSGreg Clayton }
39197bacffSGreg Clayton if (add_newline)
40197bacffSGreg Clayton strm.EOL();
41197bacffSGreg Clayton }
42197bacffSGreg Clayton
CommandReturnObject(bool colors)43de019b88SJonas Devlieghere CommandReturnObject::CommandReturnObject(bool colors)
441a216fb1SJonas Devlieghere : m_out_stream(colors), m_err_stream(colors) {}
45197bacffSGreg Clayton
AppendErrorWithFormat(const char * format,...)46b9c1b51eSKate Stone void CommandReturnObject::AppendErrorWithFormat(const char *format, ...) {
4731b9acaeSDavid Spickett SetStatus(eReturnStatusFailed);
4831b9acaeSDavid Spickett
49a7154527SJohnny Chen if (!format)
50a7154527SJohnny Chen return;
5130fdc8d8SChris Lattner va_list args;
5230fdc8d8SChris Lattner va_start(args, format);
5330fdc8d8SChris Lattner StreamString sstrm;
5430fdc8d8SChris Lattner sstrm.PrintfVarArg(format, args);
5530fdc8d8SChris Lattner va_end(args);
5630fdc8d8SChris Lattner
57adcd0268SBenjamin Kramer const std::string &s = std::string(sstrm.GetString());
58b9c1b51eSKate Stone if (!s.empty()) {
59de019b88SJonas Devlieghere error(GetErrorStream());
60de019b88SJonas Devlieghere DumpStringToStreamWithNewline(GetErrorStream(), s);
61197bacffSGreg Clayton }
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner
AppendMessageWithFormat(const char * format,...)64b9c1b51eSKate Stone void CommandReturnObject::AppendMessageWithFormat(const char *format, ...) {
65a7154527SJohnny Chen if (!format)
66a7154527SJohnny Chen return;
6730fdc8d8SChris Lattner va_list args;
6830fdc8d8SChris Lattner va_start(args, format);
6930fdc8d8SChris Lattner StreamString sstrm;
7030fdc8d8SChris Lattner sstrm.PrintfVarArg(format, args);
7130fdc8d8SChris Lattner va_end(args);
7230fdc8d8SChris Lattner
73c156427dSZachary Turner GetOutputStream() << sstrm.GetString();
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner
AppendWarningWithFormat(const char * format,...)76b9c1b51eSKate Stone void CommandReturnObject::AppendWarningWithFormat(const char *format, ...) {
77a7154527SJohnny Chen if (!format)
78a7154527SJohnny Chen return;
7930fdc8d8SChris Lattner va_list args;
8030fdc8d8SChris Lattner va_start(args, format);
8130fdc8d8SChris Lattner StreamString sstrm;
8230fdc8d8SChris Lattner sstrm.PrintfVarArg(format, args);
8330fdc8d8SChris Lattner va_end(args);
8430fdc8d8SChris Lattner
85de019b88SJonas Devlieghere warning(GetErrorStream()) << sstrm.GetString();
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner
AppendMessage(llvm::StringRef in_string)880b172c0cSZachary Turner void CommandReturnObject::AppendMessage(llvm::StringRef in_string) {
890b172c0cSZachary Turner if (in_string.empty())
90a7154527SJohnny Chen return;
916201017dSRaphael Isemann GetOutputStream() << in_string.rtrim() << '\n';
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner
AppendWarning(llvm::StringRef in_string)940b172c0cSZachary Turner void CommandReturnObject::AppendWarning(llvm::StringRef in_string) {
950b172c0cSZachary Turner if (in_string.empty())
96a7154527SJohnny Chen return;
976201017dSRaphael Isemann warning(GetErrorStream()) << in_string.rtrim() << '\n';
9830fdc8d8SChris Lattner }
9930fdc8d8SChris Lattner
AppendError(llvm::StringRef in_string)1000b172c0cSZachary Turner void CommandReturnObject::AppendError(llvm::StringRef in_string) {
101983ed1b5SDavid Spickett SetStatus(eReturnStatusFailed);
102fe63db25SDavid Spickett if (in_string.empty())
103fe63db25SDavid Spickett return;
1046201017dSRaphael Isemann error(GetErrorStream()) << in_string.rtrim() << '\n';
10530fdc8d8SChris Lattner }
10630fdc8d8SChris Lattner
SetError(const Status & error,const char * fallback_error_cstr)10797206d57SZachary Turner void CommandReturnObject::SetError(const Status &error,
108b9c1b51eSKate Stone const char *fallback_error_cstr) {
109*af91446aSJonas Devlieghere if (error.Fail())
1101b1c8e4aSDavid Spickett AppendError(error.AsCString(fallback_error_cstr));
111144f3a9cSGreg Clayton }
112eff81a47SEnrico Granata
SetError(llvm::Error error)1132a6dbedfSJonas Devlieghere void CommandReturnObject::SetError(llvm::Error error) {
1142a6dbedfSJonas Devlieghere if (error)
1152a6dbedfSJonas Devlieghere AppendError(llvm::toString(std::move(error)));
1162a6dbedfSJonas Devlieghere }
1172a6dbedfSJonas Devlieghere
11805097246SAdrian Prantl // Similar to AppendError, but do not prepend 'Status: ' to message, and don't
11905097246SAdrian Prantl // append "\n" to the end of it.
12030fdc8d8SChris Lattner
AppendRawError(llvm::StringRef in_string)1210b172c0cSZachary Turner void CommandReturnObject::AppendRawError(llvm::StringRef in_string) {
122983ed1b5SDavid Spickett SetStatus(eReturnStatusFailed);
12312ae3cb7SDavid Spickett assert(!in_string.empty() && "Expected a non-empty error message");
1240b172c0cSZachary Turner GetErrorStream() << in_string;
12530fdc8d8SChris Lattner }
12630fdc8d8SChris Lattner
SetStatus(ReturnStatus status)127b9c1b51eSKate Stone void CommandReturnObject::SetStatus(ReturnStatus status) { m_status = status; }
12830fdc8d8SChris Lattner
GetStatus() const129fddedcaeSJordan Rupprecht ReturnStatus CommandReturnObject::GetStatus() const { return m_status; }
13030fdc8d8SChris Lattner
Succeeded() const131fddedcaeSJordan Rupprecht bool CommandReturnObject::Succeeded() const {
13230fdc8d8SChris Lattner return m_status <= eReturnStatusSuccessContinuingResult;
13330fdc8d8SChris Lattner }
13430fdc8d8SChris Lattner
HasResult() const135fddedcaeSJordan Rupprecht bool CommandReturnObject::HasResult() const {
13630fdc8d8SChris Lattner return (m_status == eReturnStatusSuccessFinishResult ||
13730fdc8d8SChris Lattner m_status == eReturnStatusSuccessContinuingResult);
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner
Clear()140b9c1b51eSKate Stone void CommandReturnObject::Clear() {
1419d0402b1SGreg Clayton lldb::StreamSP stream_sp;
1429d0402b1SGreg Clayton stream_sp = m_out_stream.GetStreamAtIndex(eStreamStringIndex);
1439d0402b1SGreg Clayton if (stream_sp)
1449d0402b1SGreg Clayton static_cast<StreamString *>(stream_sp.get())->Clear();
1459d0402b1SGreg Clayton stream_sp = m_err_stream.GetStreamAtIndex(eStreamStringIndex);
1469d0402b1SGreg Clayton if (stream_sp)
1479d0402b1SGreg Clayton static_cast<StreamString *>(stream_sp.get())->Clear();
14830fdc8d8SChris Lattner m_status = eReturnStatusStarted;
1499d0402b1SGreg Clayton m_did_change_process_state = false;
1501a216fb1SJonas Devlieghere m_suppress_immediate_output = false;
15145a44f3cSGreg Clayton m_interactive = true;
15230fdc8d8SChris Lattner }
15330fdc8d8SChris Lattner
GetDidChangeProcessState() const154fddedcaeSJordan Rupprecht bool CommandReturnObject::GetDidChangeProcessState() const {
15530fdc8d8SChris Lattner return m_did_change_process_state;
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner
SetDidChangeProcessState(bool b)158b9c1b51eSKate Stone void CommandReturnObject::SetDidChangeProcessState(bool b) {
15930fdc8d8SChris Lattner m_did_change_process_state = b;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner
GetInteractive() const162b9c1b51eSKate Stone bool CommandReturnObject::GetInteractive() const { return m_interactive; }
16345a44f3cSGreg Clayton
SetInteractive(bool b)164b9c1b51eSKate Stone void CommandReturnObject::SetInteractive(bool b) { m_interactive = b; }
1651a216fb1SJonas Devlieghere
GetSuppressImmediateOutput() const1661a216fb1SJonas Devlieghere bool CommandReturnObject::GetSuppressImmediateOutput() const {
1671a216fb1SJonas Devlieghere return m_suppress_immediate_output;
1681a216fb1SJonas Devlieghere }
1691a216fb1SJonas Devlieghere
SetSuppressImmediateOutput(bool b)1701a216fb1SJonas Devlieghere void CommandReturnObject::SetSuppressImmediateOutput(bool b) {
1711a216fb1SJonas Devlieghere m_suppress_immediate_output = b;
1721a216fb1SJonas Devlieghere }
173