]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Support/WithColor.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Support / WithColor.cpp
1 //===- WithColor.cpp ------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/Support/WithColor.h"
11 #include "llvm/Support/raw_ostream.h"
12
13 using namespace llvm;
14
15 cl::OptionCategory llvm::ColorCategory("Color Options");
16
17 static cl::opt<cl::boolOrDefault>
18     UseColor("color", cl::cat(ColorCategory),
19              cl::desc("Use colors in output (default=autodetect)"),
20              cl::init(cl::BOU_UNSET));
21
22 WithColor::WithColor(raw_ostream &OS, HighlightColor Color, bool DisableColors)
23     : OS(OS), DisableColors(DisableColors) {
24   // Detect color from terminal type unless the user passed the --color option.
25   if (colorsEnabled()) {
26     switch (Color) {
27     case HighlightColor::Address:
28       OS.changeColor(raw_ostream::YELLOW);
29       break;
30     case HighlightColor::String:
31       OS.changeColor(raw_ostream::GREEN);
32       break;
33     case HighlightColor::Tag:
34       OS.changeColor(raw_ostream::BLUE);
35       break;
36     case HighlightColor::Attribute:
37       OS.changeColor(raw_ostream::CYAN);
38       break;
39     case HighlightColor::Enumerator:
40       OS.changeColor(raw_ostream::MAGENTA);
41       break;
42     case HighlightColor::Macro:
43       OS.changeColor(raw_ostream::RED);
44       break;
45     case HighlightColor::Error:
46       OS.changeColor(raw_ostream::RED, true);
47       break;
48     case HighlightColor::Warning:
49       OS.changeColor(raw_ostream::MAGENTA, true);
50       break;
51     case HighlightColor::Note:
52       OS.changeColor(raw_ostream::BLACK, true);
53       break;
54     case HighlightColor::Remark:
55       OS.changeColor(raw_ostream::BLUE, true);
56       break;
57     }
58   }
59 }
60
61 raw_ostream &WithColor::error() { return error(errs()); }
62
63 raw_ostream &WithColor::warning() { return warning(errs()); }
64
65 raw_ostream &WithColor::note() { return note(errs()); }
66
67 raw_ostream &WithColor::remark() { return remark(errs()); }
68
69 raw_ostream &WithColor::error(raw_ostream &OS, StringRef Prefix,
70                               bool DisableColors) {
71   if (!Prefix.empty())
72     OS << Prefix << ": ";
73   return WithColor(OS, HighlightColor::Error, DisableColors).get()
74          << "error: ";
75 }
76
77 raw_ostream &WithColor::warning(raw_ostream &OS, StringRef Prefix,
78                                 bool DisableColors) {
79   if (!Prefix.empty())
80     OS << Prefix << ": ";
81   return WithColor(OS, HighlightColor::Warning, DisableColors).get()
82          << "warning: ";
83 }
84
85 raw_ostream &WithColor::note(raw_ostream &OS, StringRef Prefix,
86                              bool DisableColors) {
87   if (!Prefix.empty())
88     OS << Prefix << ": ";
89   return WithColor(OS, HighlightColor::Note, DisableColors).get() << "note: ";
90 }
91
92 raw_ostream &WithColor::remark(raw_ostream &OS, StringRef Prefix,
93                                bool DisableColors) {
94   if (!Prefix.empty())
95     OS << Prefix << ": ";
96   return WithColor(OS, HighlightColor::Remark, DisableColors).get()
97          << "remark: ";
98 }
99
100 bool WithColor::colorsEnabled() {
101   if (DisableColors)
102     return false;
103   if (UseColor == cl::BOU_UNSET)
104     return OS.has_colors();
105   return UseColor == cl::BOU_TRUE;
106 }
107
108 WithColor &WithColor::changeColor(raw_ostream::Colors Color, bool Bold,
109                                   bool BG) {
110   if (colorsEnabled())
111     OS.changeColor(Color, Bold, BG);
112   return *this;
113 }
114
115 WithColor &WithColor::resetColor() {
116   if (colorsEnabled())
117     OS.resetColor();
118   return *this;
119 }
120
121 WithColor::~WithColor() { resetColor(); }