From f819b42057b2baea205569dd808c4fcf2bc4d630 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Sat, 24 Jan 2015 03:07:30 +0100 Subject: Added support for new SourceContext to TerminalLogger --- src/core/common/Logger.cpp | 94 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 24 deletions(-) (limited to 'src/core/common/Logger.cpp') diff --git a/src/core/common/Logger.cpp b/src/core/common/Logger.cpp index 034953d..aa61e6a 100644 --- a/src/core/common/Logger.cpp +++ b/src/core/common/Logger.cpp @@ -21,6 +21,7 @@ #include "Logger.hpp" #include "Terminal.hpp" +#include "Utils.hpp" namespace ousia { @@ -317,30 +318,75 @@ void TerminalLogger::processMessage(const Message &msg) os << msg.msg << std::endl; // Print the error message context if available - /* if (ctx.valid()) { - size_t relPos = ctx.relPos; - if (ctx.truncatedStart) { - os << "[...] "; - } - os << ctx.text; - if (ctx.truncatedEnd) { - os << " [...]"; - } - os << std::endl; - - if (ctx.truncatedStart) { - os << " "; - } - - for (size_t i = 0; i < relPos; i++) { - if (i < ctx.text.size() && ctx.text[i] == '\t') { - os << '\t'; - } else { - os << ' '; - } - } - os << t.color(Terminal::GREEN) << '^' << t.reset() << std::endl; - }*/ + if (ctx.hasText()) { + // Iterate over each line in the text + std::vector lines = Utils::split(ctx.text, '\n'); + + const size_t relLen = ctx.relLen ? ctx.relLen : 1; + const size_t relPos = ctx.relPos; + const size_t pstart = relPos; + const size_t pend = relPos + relLen; + + size_t lstart = 0; + size_t lend = 0; + for (size_t n = 0; n < lines.size(); n++) { + bool firstLine = n == 0; + bool lastLine = n == lines.size() - 1; + + // Indicate truncation and indent non-first lines + if (ctx.truncatedStart && firstLine) { + os << "[...] "; + } + if (!firstLine) { + os << "\t"; + } + + // Print the actual line + os << lines[n]; + + // Indicate truncation + if (ctx.truncatedEnd && lastLine) { + os << " [...]"; + } + os << std::endl; + + // Repeat truncation or indendation space in the next line + if (ctx.truncatedStart && firstLine) { + os << " "; + } + if (!firstLine) { + os << "\t"; + } + + // Print the position indicators + lend = lastLine ? pend : lstart + lines[n].size(); + for (size_t i = lstart; i < lend; i++) { + if (i >= pstart && i < pend) { + os << t.color(Terminal::GREEN); + for (; i < std::min(lend, pend); i++) { + if (relLen == 1) { + os << '^'; + } else { + os << '~'; + } + if (i < ctx.text.size() && ctx.text[i] == '\t') { + os << '\t'; + } + } + os << t.reset(); + } else { + if (i < ctx.text.size() && ctx.text[i] == '\t') { + os << '\t'; + } else { + os << ' '; + } + } + } + os << std::endl; + + lstart = lend; + } + } } } -- cgit v1.2.3