summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/SourceMgr.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-04-18 19:04:15 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-04-18 19:04:15 +0000
commitbb73d1979409fa3354380b014cb0af6c907e9a53 (patch)
tree5202a5f1d0164e5e59d784ac8f75b0ae4f90a7a2 /llvm/lib/Support/SourceMgr.cpp
parentdba3f5be00cfbec6386dd7edd8422138821e763c (diff)
downloadbcm5719-llvm-bb73d1979409fa3354380b014cb0af6c907e9a53.tar.gz
bcm5719-llvm-bb73d1979409fa3354380b014cb0af6c907e9a53.zip
SourceMgr: Colorize diagnostics.
Same color scheme as clang uses. The colors are only enabled if the output is a tty. llvm-svn: 155035
Diffstat (limited to 'llvm/lib/Support/SourceMgr.cpp')
-rw-r--r--llvm/lib/Support/SourceMgr.cpp48
1 files changed, 41 insertions, 7 deletions
diff --git a/llvm/lib/Support/SourceMgr.cpp b/llvm/lib/Support/SourceMgr.cpp
index bbe36b260b9..15278c598e5 100644
--- a/llvm/lib/Support/SourceMgr.cpp
+++ b/llvm/lib/Support/SourceMgr.cpp
@@ -193,7 +193,8 @@ SMDiagnostic SourceMgr::GetMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
}
void SourceMgr::PrintMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
- const Twine &Msg, ArrayRef<SMRange> Ranges) const {
+ const Twine &Msg, ArrayRef<SMRange> Ranges,
+ bool ShowColors) const {
SMDiagnostic Diagnostic = GetMessage(Loc, Kind, Msg, Ranges);
// Report the message with the diagnostic handler if present.
@@ -208,7 +209,7 @@ void SourceMgr::PrintMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
assert(CurBuf != -1 && "Invalid or unspecified location!");
PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS);
- Diagnostic.print(0, OS);
+ Diagnostic.print(0, OS, ShowColors);
}
//===----------------------------------------------------------------------===//
@@ -225,7 +226,14 @@ SMDiagnostic::SMDiagnostic(const SourceMgr &sm, SMLoc L, const std::string &FN,
}
-void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const {
+void SMDiagnostic::print(const char *ProgName, raw_ostream &S,
+ bool ShowColors) const {
+ // Display colors only if OS goes to a tty.
+ ShowColors &= S.is_displayed();
+
+ if (ShowColors)
+ S.changeColor(raw_ostream::SAVEDCOLOR, true);
+
if (ProgName && ProgName[0])
S << ProgName << ": ";
@@ -244,13 +252,33 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const {
}
switch (Kind) {
- case SourceMgr::DK_Error: S << "error: "; break;
- case SourceMgr::DK_Warning: S << "warning: "; break;
- case SourceMgr::DK_Note: S << "note: "; break;
+ case SourceMgr::DK_Error:
+ if (ShowColors)
+ S.changeColor(raw_ostream::RED, true);
+ S << "error: ";
+ break;
+ case SourceMgr::DK_Warning:
+ if (ShowColors)
+ S.changeColor(raw_ostream::MAGENTA, true);
+ S << "warning: ";
+ break;
+ case SourceMgr::DK_Note:
+ if (ShowColors)
+ S.changeColor(raw_ostream::BLACK, true);
+ S << "note: ";
+ break;
}
-
+
+ if (ShowColors) {
+ S.resetColor();
+ S.changeColor(raw_ostream::SAVEDCOLOR, true);
+ }
+
S << Message << '\n';
+ if (ShowColors)
+ S.resetColor();
+
if (LineNo == -1 || ColumnNo == -1)
return;
@@ -292,6 +320,9 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const {
}
S << '\n';
+ if (ShowColors)
+ S.changeColor(raw_ostream::GREEN, true);
+
// Print out the caret line, matching tabs in the source line.
for (unsigned i = 0, e = CaretLine.size(), OutCol = 0; i != e; ++i) {
if (i >= LineContents.size() || LineContents[i] != '\t') {
@@ -306,6 +337,9 @@ void SMDiagnostic::print(const char *ProgName, raw_ostream &S) const {
++OutCol;
} while (OutCol & 7);
}
+
+ if (ShowColors)
+ S.resetColor();
S << '\n';
}
OpenPOWER on IntegriCloud