Skip to content

Commit

Permalink
[Support] Allow the ability to change WithColor's auto detection func…
Browse files Browse the repository at this point in the history
…tion

WithColor has an "auto detection mode" which looks whether the
corresponding whether the corresponding cl::opt is enabled or not. While
this is great when opting into cl::opt, it's not so great for downstream
users of this utility, which might have their own competing options to
enable or disable colors. The WithColor constructor takes a color mode,
but the big benefit of the class are its static error and warning
helpers and default error handlers.

In order to allow users of this utility to enable or disable colors
globally, this patch adds the ability to specify a global auto detection
function. By default, the auto detection function behaves the way that
it does today. The benefit of this patch lies in that it can be
overwritten. In addition to a ability to change the auto detection
function, I've also made it possible to get your hands on the default
auto detection function, so you swap it back if if you so desire.

This patch allow downstream users (like LLDB) to globally disable colors
with its own command line flag.

Differential revision: https://reviews.llvm.org/D120593
  • Loading branch information
JDevlieghere committed Feb 28, 2022
1 parent 1768cb3 commit a83cf7a
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 7 deletions.
12 changes: 7 additions & 5 deletions lldb/tools/driver/Driver.cpp
Expand Up @@ -186,6 +186,13 @@ SBError Driver::ProcessArgs(const opt::InputArgList &args, bool &exiting) {
m_debugger.SkipLLDBInitFiles(false);
m_debugger.SkipAppInitFiles(false);

if (args.hasArg(OPT_no_use_colors)) {
m_debugger.SetUseColor(false);
WithColor::setAutoDetectFunction(
[](const llvm::raw_ostream &OS) { return false; });
m_option_data.m_debug_mode = true;
}

if (args.hasArg(OPT_version)) {
m_option_data.m_print_version = true;
}
Expand Down Expand Up @@ -227,11 +234,6 @@ SBError Driver::ProcessArgs(const opt::InputArgList &args, bool &exiting) {
m_debugger.GetInstanceName());
}

if (args.hasArg(OPT_no_use_colors)) {
m_debugger.SetUseColor(false);
m_option_data.m_debug_mode = true;
}

if (auto *arg = args.getLastArg(OPT_file)) {
auto arg_value = arg->getValue();
SBFileSpec file(arg_value);
Expand Down
12 changes: 12 additions & 0 deletions llvm/include/llvm/Support/WithColor.h
Expand Up @@ -11,6 +11,8 @@

#include "llvm/Support/raw_ostream.h"

#include <functional>

namespace llvm {

class Error;
Expand Down Expand Up @@ -54,6 +56,9 @@ class WithColor {
raw_ostream &OS;
ColorMode Mode;

using AutoDetectFunctionType = std::function<bool(const raw_ostream &OS)>;
static AutoDetectFunctionType AutoDetectFunction;

public:
/// To be used like this: WithColor(OS, HighlightColor::String) << "text";
/// @param OS The output stream
Expand Down Expand Up @@ -132,6 +137,13 @@ class WithColor {
/// Implement default handling for Warning.
/// Print "warning: " to stderr.
static void defaultWarningHandler(Error Warning);

/// Retrieve the default color auto detection function.
static AutoDetectFunctionType defaultAutoDetectFunction();

/// Change the global auto detection function.
static void
setAutoDetectFunction(AutoDetectFunctionType NewAutoDetectFunction);
};

} // end namespace llvm
Expand Down
18 changes: 16 additions & 2 deletions llvm/lib/Support/WithColor.cpp
Expand Up @@ -33,6 +33,9 @@ struct CreateUseColor {
static ManagedStatic<cl::opt<cl::boolOrDefault>, CreateUseColor> UseColor;
void llvm::initWithColorOptions() { *UseColor; }

WithColor::AutoDetectFunctionType WithColor::AutoDetectFunction =
WithColor::defaultAutoDetectFunction();

WithColor::WithColor(raw_ostream &OS, HighlightColor Color, ColorMode Mode)
: OS(OS), Mode(Mode) {
// Detect color from terminal type unless the user passed the --color option.
Expand Down Expand Up @@ -127,8 +130,7 @@ bool WithColor::colorsEnabled() {
case ColorMode::Disable:
return false;
case ColorMode::Auto:
return *UseColor == cl::BOU_UNSET ? OS.has_colors()
: *UseColor == cl::BOU_TRUE;
return AutoDetectFunction(OS);
}
llvm_unreachable("All cases handled above.");
}
Expand Down Expand Up @@ -159,3 +161,15 @@ void WithColor::defaultWarningHandler(Error Warning) {
WithColor::warning() << Info.message() << '\n';
});
}

WithColor::AutoDetectFunctionType WithColor::defaultAutoDetectFunction() {
return [](const raw_ostream &OS) {
return *UseColor == cl::BOU_UNSET ? OS.has_colors()
: *UseColor == cl::BOU_TRUE;
};
}

void WithColor::setAutoDetectFunction(
AutoDetectFunctionType NewAutoDetectFunction) {
AutoDetectFunction = std::move(NewAutoDetectFunction);
}

0 comments on commit a83cf7a

Please sign in to comment.