Index: lldb/include/lldb/Interpreter/CommandReturnObject.h =================================================================== --- lldb/include/lldb/Interpreter/CommandReturnObject.h +++ lldb/include/lldb/Interpreter/CommandReturnObject.h @@ -16,6 +16,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/FormatVariadic.h" +#include "llvm/Support/WithColor.h" #include @@ -23,7 +24,7 @@ class CommandReturnObject { public: - CommandReturnObject(); + CommandReturnObject(bool colors = false); ~CommandReturnObject(); Index: lldb/include/lldb/Utility/Stream.h =================================================================== --- lldb/include/lldb/Utility/Stream.h +++ lldb/include/lldb/Utility/Stream.h @@ -56,12 +56,13 @@ /// /// Construct with dump flags \a flags and the default address size. \a /// flags can be any of the above enumeration logical OR'ed together. - Stream(uint32_t flags, uint32_t addr_size, lldb::ByteOrder byte_order); + Stream(uint32_t flags, uint32_t addr_size, lldb::ByteOrder byte_order, + bool colors = false); /// Construct a default Stream, not binary, host byte order and host addr /// size. /// - Stream(); + Stream(bool colors = false); // FIXME: Streams should not be copyable. Stream(const Stream &other) : m_forwarder(*this) { (*this) = other; } @@ -398,13 +399,17 @@ m_target.Write(Ptr, Size); } + bool has_colors() const override { return true; } + uint64_t current_pos() const override { return m_target.GetWrittenBytes(); } public: - RawOstreamForward(Stream &target) - : llvm::raw_ostream(/*unbuffered*/ true), m_target(target) {} + RawOstreamForward(Stream &target, bool colors = false) + : llvm::raw_ostream(/*unbuffered*/ true), m_target(target) { + enable_colors(colors); + } }; RawOstreamForward m_forwarder; }; Index: lldb/include/lldb/Utility/StreamTee.h =================================================================== --- lldb/include/lldb/Utility/StreamTee.h +++ lldb/include/lldb/Utility/StreamTee.h @@ -19,7 +19,8 @@ class StreamTee : public Stream { public: - StreamTee() : Stream(), m_streams_mutex(), m_streams() {} + StreamTee(bool colors = false) + : Stream(colors), m_streams_mutex(), m_streams() {} StreamTee(lldb::StreamSP &stream_sp) : Stream(), m_streams_mutex(), m_streams() { Index: lldb/source/Interpreter/CommandInterpreter.cpp =================================================================== --- lldb/source/Interpreter/CommandInterpreter.cpp +++ lldb/source/Interpreter/CommandInterpreter.cpp @@ -209,7 +209,7 @@ static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); - CommandReturnObject result; + CommandReturnObject result(m_debugger.GetUseColor()); LoadCommandDictionary(); @@ -2792,7 +2792,7 @@ StartHandlingCommand(); - lldb_private::CommandReturnObject result; + lldb_private::CommandReturnObject result(m_debugger.GetUseColor()); HandleCommand(line.c_str(), eLazyBoolCalculate, result); // Now emit the command output text from the command we just executed Index: lldb/source/Interpreter/CommandReturnObject.cpp =================================================================== --- lldb/source/Interpreter/CommandReturnObject.cpp +++ lldb/source/Interpreter/CommandReturnObject.cpp @@ -28,9 +28,10 @@ strm.EOL(); } -CommandReturnObject::CommandReturnObject() - : m_out_stream(), m_err_stream(), m_status(eReturnStatusStarted), - m_did_change_process_state(false), m_interactive(true) {} +CommandReturnObject::CommandReturnObject(bool colors) + : m_out_stream(colors), m_err_stream(colors), + m_status(eReturnStatusStarted), m_did_change_process_state(false), + m_interactive(true) {} CommandReturnObject::~CommandReturnObject() {} @@ -45,9 +46,8 @@ const std::string &s = std::string(sstrm.GetString()); if (!s.empty()) { - Stream &error_strm = GetErrorStream(); - error_strm.PutCString("error: "); - DumpStringToStreamWithNewline(error_strm, s); + llvm::WithColor::error(GetErrorStream().AsRawOstream()); + DumpStringToStreamWithNewline(GetErrorStream(), s); } } @@ -72,7 +72,8 @@ sstrm.PrintfVarArg(format, args); va_end(args); - GetErrorStream() << "warning: " << sstrm.GetString(); + llvm::WithColor::warning(GetErrorStream().AsRawOstream()) + << sstrm.GetString(); } void CommandReturnObject::AppendMessage(llvm::StringRef in_string) { @@ -84,7 +85,8 @@ void CommandReturnObject::AppendWarning(llvm::StringRef in_string) { if (in_string.empty()) return; - GetErrorStream() << "warning: " << in_string << "\n"; + llvm::WithColor::warning(GetErrorStream().AsRawOstream()) + << in_string << '\n'; } // Similar to AppendWarning, but do not prepend 'warning: ' to message, and @@ -99,7 +101,7 @@ void CommandReturnObject::AppendError(llvm::StringRef in_string) { if (in_string.empty()) return; - GetErrorStream() << "error: " << in_string << "\n"; + llvm::WithColor::error(GetErrorStream().AsRawOstream()) << in_string << '\n'; } void CommandReturnObject::SetError(const Status &error, Index: lldb/source/Utility/Stream.cpp =================================================================== --- lldb/source/Utility/Stream.cpp +++ lldb/source/Utility/Stream.cpp @@ -22,13 +22,14 @@ using namespace lldb; using namespace lldb_private; -Stream::Stream(uint32_t flags, uint32_t addr_size, ByteOrder byte_order) +Stream::Stream(uint32_t flags, uint32_t addr_size, ByteOrder byte_order, + bool colors) : m_flags(flags), m_addr_size(addr_size), m_byte_order(byte_order), - m_indent_level(0), m_forwarder(*this) {} + m_indent_level(0), m_forwarder(*this, colors) {} -Stream::Stream() +Stream::Stream(bool colors) : m_flags(0), m_addr_size(4), m_byte_order(endian::InlHostByteOrder()), - m_indent_level(0), m_forwarder(*this) {} + m_indent_level(0), m_forwarder(*this, colors) {} // Destructor Stream::~Stream() {}