//===- WithColor.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 "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; cl::OptionCategory llvm::ColorCategory("Color Options"); static cl::opt UseColor("color", cl::cat(ColorCategory), cl::desc("Use colors in output (default=autodetect)"), cl::init(cl::BOU_UNSET)); WithColor::WithColor(raw_ostream &OS, HighlightColor Color, bool DisableColors) : OS(OS), DisableColors(DisableColors) { // Detect color from terminal type unless the user passed the --color option. if (colorsEnabled()) { switch (Color) { case HighlightColor::Address: OS.changeColor(raw_ostream::YELLOW); break; case HighlightColor::String: OS.changeColor(raw_ostream::GREEN); break; case HighlightColor::Tag: OS.changeColor(raw_ostream::BLUE); break; case HighlightColor::Attribute: OS.changeColor(raw_ostream::CYAN); break; case HighlightColor::Enumerator: OS.changeColor(raw_ostream::MAGENTA); break; case HighlightColor::Macro: OS.changeColor(raw_ostream::RED); break; case HighlightColor::Error: OS.changeColor(raw_ostream::RED, true); break; case HighlightColor::Warning: OS.changeColor(raw_ostream::MAGENTA, true); break; case HighlightColor::Note: OS.changeColor(raw_ostream::BLACK, true); break; case HighlightColor::Remark: OS.changeColor(raw_ostream::BLUE, true); break; } } } raw_ostream &WithColor::error() { return error(errs()); } raw_ostream &WithColor::warning() { return warning(errs()); } raw_ostream &WithColor::note() { return note(errs()); } raw_ostream &WithColor::remark() { return remark(errs()); } raw_ostream &WithColor::error(raw_ostream &OS, StringRef Prefix, bool DisableColors) { if (!Prefix.empty()) OS << Prefix << ": "; return WithColor(OS, HighlightColor::Error, DisableColors).get() << "error: "; } raw_ostream &WithColor::warning(raw_ostream &OS, StringRef Prefix, bool DisableColors) { if (!Prefix.empty()) OS << Prefix << ": "; return WithColor(OS, HighlightColor::Warning, DisableColors).get() << "warning: "; } raw_ostream &WithColor::note(raw_ostream &OS, StringRef Prefix, bool DisableColors) { if (!Prefix.empty()) OS << Prefix << ": "; return WithColor(OS, HighlightColor::Note, DisableColors).get() << "note: "; } raw_ostream &WithColor::remark(raw_ostream &OS, StringRef Prefix, bool DisableColors) { if (!Prefix.empty()) OS << Prefix << ": "; return WithColor(OS, HighlightColor::Remark, DisableColors).get() << "remark: "; } bool WithColor::colorsEnabled() { if (DisableColors) return false; if (UseColor == cl::BOU_UNSET) return OS.has_colors(); return UseColor == cl::BOU_TRUE; } WithColor &WithColor::changeColor(raw_ostream::Colors Color, bool Bold, bool BG) { if (colorsEnabled()) OS.changeColor(Color, Bold, BG); return *this; } WithColor &WithColor::resetColor() { if (colorsEnabled()) OS.resetColor(); return *this; } WithColor::~WithColor() { resetColor(); }