JDevlieghere created this revision.
JDevlieghere added reviewers: aprantl, RKSimon, jdenny.
Herald added subscribers: dexonsmith, hiraditya.
JDevlieghere requested review of this revision.
Herald added a project: LLVM.

`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.


https://reviews.llvm.org/D120593

Files:
  lldb/tools/driver/Driver.cpp
  llvm/include/llvm/Support/WithColor.h
  llvm/lib/Support/WithColor.cpp

Index: llvm/lib/Support/WithColor.cpp
===================================================================
--- llvm/lib/Support/WithColor.cpp
+++ llvm/lib/Support/WithColor.cpp
@@ -33,6 +33,12 @@
 static ManagedStatic<cl::opt<cl::boolOrDefault>, CreateUseColor> UseColor;
 void llvm::initWithColorOptions() { *UseColor; }
 
+WithColor::AutoDetectFunctionType WithColor::AutoDetectFunction =
+    [](const raw_ostream &OS) {
+      return *UseColor == cl::BOU_UNSET ? OS.has_colors()
+                                        : *UseColor == cl::BOU_TRUE;
+    };
+
 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.
@@ -127,8 +133,7 @@
   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.");
 }
@@ -159,3 +164,15 @@
     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);
+}
Index: llvm/include/llvm/Support/WithColor.h
===================================================================
--- llvm/include/llvm/Support/WithColor.h
+++ llvm/include/llvm/Support/WithColor.h
@@ -11,6 +11,8 @@
 
 #include "llvm/Support/raw_ostream.h"
 
+#include <functional>
+
 namespace llvm {
 
 class Error;
@@ -54,6 +56,9 @@
   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
@@ -132,6 +137,13 @@
   /// 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
Index: lldb/tools/driver/Driver.cpp
===================================================================
--- lldb/tools/driver/Driver.cpp
+++ lldb/tools/driver/Driver.cpp
@@ -186,6 +186,13 @@
   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;
   }
@@ -227,11 +234,6 @@
                                           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);
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to