summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbutil/DiffPrinter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-pdbutil/DiffPrinter.cpp')
-rw-r--r--llvm/tools/llvm-pdbutil/DiffPrinter.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/llvm/tools/llvm-pdbutil/DiffPrinter.cpp b/llvm/tools/llvm-pdbutil/DiffPrinter.cpp
new file mode 100644
index 00000000000..b608d54d0e2
--- /dev/null
+++ b/llvm/tools/llvm-pdbutil/DiffPrinter.cpp
@@ -0,0 +1,106 @@
+
+#include "DiffPrinter.h"
+
+#include "llvm/Support/FormatAdapters.h"
+
+using namespace llvm;
+using namespace llvm::pdb;
+
+static void setColor(llvm::raw_ostream &OS, DiffResult Result) {
+ switch (Result) {
+ case DiffResult::IDENTICAL:
+ OS.changeColor(raw_ostream::Colors::GREEN, false);
+ break;
+ case DiffResult::EQUIVALENT:
+ OS.changeColor(raw_ostream::Colors::YELLOW, true);
+ break;
+ default:
+ OS.changeColor(raw_ostream::Colors::RED, false);
+ break;
+ }
+}
+
+DiffPrinter::DiffPrinter(uint32_t Indent, StringRef Header,
+ uint32_t PropertyWidth, uint32_t FieldWidth,
+ raw_ostream &Stream)
+ : Indent(Indent), PropertyWidth(PropertyWidth), FieldWidth(FieldWidth),
+ OS(Stream) {
+ printHeaderRow();
+ printFullRow(Header);
+}
+
+DiffPrinter::~DiffPrinter() {}
+
+void DiffPrinter::printFullRow(StringRef Text) {
+ newLine();
+ printField(Text, DiffResult::UNSPECIFIED, AlignStyle::Center,
+ PropertyWidth + 1 + FieldWidth + 1 + FieldWidth);
+ printSeparatorRow();
+}
+
+void DiffPrinter::printSeparatorRow() {
+ newLine();
+ OS << formatv("{0}", fmt_repeat('-', PropertyWidth));
+ OS << '+';
+ OS << formatv("{0}", fmt_repeat('-', FieldWidth));
+ OS << '+';
+ OS << formatv("{0}", fmt_repeat('-', FieldWidth));
+ OS << '|';
+}
+
+void DiffPrinter::printHeaderRow() {
+ newLine('-');
+ OS << formatv("{0}", fmt_repeat('-', PropertyWidth + 2 * FieldWidth + 3));
+}
+
+void DiffPrinter::newLine(char InitialChar) {
+ OS << "\n";
+ OS.indent(Indent) << InitialChar;
+}
+
+void DiffPrinter::printExplicit(StringRef Property, DiffResult C,
+ StringRef Left, StringRef Right) {
+ newLine();
+ printField(Property, DiffResult::UNSPECIFIED, AlignStyle::Right,
+ PropertyWidth);
+ printField(Left, C, AlignStyle::Center, FieldWidth);
+ printField(Right, C, AlignStyle::Center, FieldWidth);
+ printSeparatorRow();
+}
+
+void DiffPrinter::printSame(StringRef Property, StringRef Value) {
+ newLine();
+ printField(Property, DiffResult::UNSPECIFIED, AlignStyle::Right,
+ PropertyWidth);
+ printField(Value, DiffResult::IDENTICAL, AlignStyle::Center,
+ FieldWidth + 1 + FieldWidth);
+ printSeparatorRow();
+}
+
+void DiffPrinter::printDifferent(StringRef Property, StringRef Left,
+ StringRef Right) {
+ newLine();
+ printField(Property, DiffResult::UNSPECIFIED, AlignStyle::Right,
+ PropertyWidth);
+ printField(Left, DiffResult::DIFFERENT, AlignStyle::Center, FieldWidth);
+ printField(Right, DiffResult::DIFFERENT, AlignStyle::Center, FieldWidth);
+ printSeparatorRow();
+}
+
+void DiffPrinter::printField(StringRef Value, DiffResult C, AlignStyle Style,
+ uint32_t Width) {
+ if (Style == AlignStyle::Right)
+ --Width;
+
+ std::string FormattedItem =
+ formatv("{0}", fmt_align(Value, Style, Width)).str();
+ if (C != DiffResult::UNSPECIFIED) {
+ setColor(OS, C);
+ OS << FormattedItem;
+ OS.resetColor();
+ } else
+ OS << FormattedItem;
+ if (Style == AlignStyle::Right)
+ OS << ' ';
+ OS << '|';
+}
OpenPOWER on IntegriCloud