
I added asserts to these in https://reviews.llvm.org/D104525. They are available (directly or otherwise) via the API so we should not assert. Restore the previous behaviour. If the message is empty, we return early before printing anything. For SetError don't assert that the error is a failure. The remaining assert is in AppendRawError which is not part of the API. Reviewed By: teemperor Differential Revision: https://reviews.llvm.org/D104778
167 lines
4.8 KiB
C++
167 lines
4.8 KiB
C++
//===-- CommandReturnObject.cpp -------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
|
|
#include "lldb/Utility/Status.h"
|
|
#include "lldb/Utility/StreamString.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
static llvm::raw_ostream &error(Stream &strm) {
|
|
return llvm::WithColor(strm.AsRawOstream(), llvm::HighlightColor::Error,
|
|
llvm::ColorMode::Enable)
|
|
<< "error: ";
|
|
}
|
|
|
|
static llvm::raw_ostream &warning(Stream &strm) {
|
|
return llvm::WithColor(strm.AsRawOstream(), llvm::HighlightColor::Warning,
|
|
llvm::ColorMode::Enable)
|
|
<< "warning: ";
|
|
}
|
|
|
|
static void DumpStringToStreamWithNewline(Stream &strm, const std::string &s) {
|
|
bool add_newline = false;
|
|
if (!s.empty()) {
|
|
// We already checked for empty above, now make sure there is a newline in
|
|
// the error, and if there isn't one, add one.
|
|
strm.Write(s.c_str(), s.size());
|
|
|
|
const char last_char = *s.rbegin();
|
|
add_newline = last_char != '\n' && last_char != '\r';
|
|
}
|
|
if (add_newline)
|
|
strm.EOL();
|
|
}
|
|
|
|
CommandReturnObject::CommandReturnObject(bool colors)
|
|
: m_out_stream(colors), m_err_stream(colors) {}
|
|
|
|
void CommandReturnObject::AppendErrorWithFormat(const char *format, ...) {
|
|
SetStatus(eReturnStatusFailed);
|
|
|
|
if (!format)
|
|
return;
|
|
va_list args;
|
|
va_start(args, format);
|
|
StreamString sstrm;
|
|
sstrm.PrintfVarArg(format, args);
|
|
va_end(args);
|
|
|
|
const std::string &s = std::string(sstrm.GetString());
|
|
if (!s.empty()) {
|
|
error(GetErrorStream());
|
|
DumpStringToStreamWithNewline(GetErrorStream(), s);
|
|
}
|
|
}
|
|
|
|
void CommandReturnObject::AppendMessageWithFormat(const char *format, ...) {
|
|
if (!format)
|
|
return;
|
|
va_list args;
|
|
va_start(args, format);
|
|
StreamString sstrm;
|
|
sstrm.PrintfVarArg(format, args);
|
|
va_end(args);
|
|
|
|
GetOutputStream() << sstrm.GetString();
|
|
}
|
|
|
|
void CommandReturnObject::AppendWarningWithFormat(const char *format, ...) {
|
|
if (!format)
|
|
return;
|
|
va_list args;
|
|
va_start(args, format);
|
|
StreamString sstrm;
|
|
sstrm.PrintfVarArg(format, args);
|
|
va_end(args);
|
|
|
|
warning(GetErrorStream()) << sstrm.GetString();
|
|
}
|
|
|
|
void CommandReturnObject::AppendMessage(llvm::StringRef in_string) {
|
|
if (in_string.empty())
|
|
return;
|
|
GetOutputStream() << in_string.rtrim() << '\n';
|
|
}
|
|
|
|
void CommandReturnObject::AppendWarning(llvm::StringRef in_string) {
|
|
if (in_string.empty())
|
|
return;
|
|
warning(GetErrorStream()) << in_string.rtrim() << '\n';
|
|
}
|
|
|
|
void CommandReturnObject::AppendError(llvm::StringRef in_string) {
|
|
SetStatus(eReturnStatusFailed);
|
|
if (in_string.empty())
|
|
return;
|
|
error(GetErrorStream()) << in_string.rtrim() << '\n';
|
|
}
|
|
|
|
void CommandReturnObject::SetError(const Status &error,
|
|
const char *fallback_error_cstr) {
|
|
AppendError(error.AsCString(fallback_error_cstr));
|
|
}
|
|
|
|
// Similar to AppendError, but do not prepend 'Status: ' to message, and don't
|
|
// append "\n" to the end of it.
|
|
|
|
void CommandReturnObject::AppendRawError(llvm::StringRef in_string) {
|
|
SetStatus(eReturnStatusFailed);
|
|
assert(!in_string.empty() && "Expected a non-empty error message");
|
|
GetErrorStream() << in_string;
|
|
}
|
|
|
|
void CommandReturnObject::SetStatus(ReturnStatus status) { m_status = status; }
|
|
|
|
ReturnStatus CommandReturnObject::GetStatus() { return m_status; }
|
|
|
|
bool CommandReturnObject::Succeeded() {
|
|
return m_status <= eReturnStatusSuccessContinuingResult;
|
|
}
|
|
|
|
bool CommandReturnObject::HasResult() {
|
|
return (m_status == eReturnStatusSuccessFinishResult ||
|
|
m_status == eReturnStatusSuccessContinuingResult);
|
|
}
|
|
|
|
void CommandReturnObject::Clear() {
|
|
lldb::StreamSP stream_sp;
|
|
stream_sp = m_out_stream.GetStreamAtIndex(eStreamStringIndex);
|
|
if (stream_sp)
|
|
static_cast<StreamString *>(stream_sp.get())->Clear();
|
|
stream_sp = m_err_stream.GetStreamAtIndex(eStreamStringIndex);
|
|
if (stream_sp)
|
|
static_cast<StreamString *>(stream_sp.get())->Clear();
|
|
m_status = eReturnStatusStarted;
|
|
m_did_change_process_state = false;
|
|
m_suppress_immediate_output = false;
|
|
m_interactive = true;
|
|
}
|
|
|
|
bool CommandReturnObject::GetDidChangeProcessState() {
|
|
return m_did_change_process_state;
|
|
}
|
|
|
|
void CommandReturnObject::SetDidChangeProcessState(bool b) {
|
|
m_did_change_process_state = b;
|
|
}
|
|
|
|
bool CommandReturnObject::GetInteractive() const { return m_interactive; }
|
|
|
|
void CommandReturnObject::SetInteractive(bool b) { m_interactive = b; }
|
|
|
|
bool CommandReturnObject::GetSuppressImmediateOutput() const {
|
|
return m_suppress_immediate_output;
|
|
}
|
|
|
|
void CommandReturnObject::SetSuppressImmediateOutput(bool b) {
|
|
m_suppress_immediate_output = b;
|
|
}
|