2020-03-22 20:25:47 +02:00
|
|
|
#include "error.hh"
|
|
|
|
|
|
|
|
#include <iostream>
|
2020-03-25 18:52:03 +02:00
|
|
|
#include <optional>
|
2020-03-22 20:25:47 +02:00
|
|
|
|
2020-04-03 01:02:40 +03:00
|
|
|
namespace nix
|
|
|
|
{
|
2020-03-22 20:25:47 +02:00
|
|
|
|
2020-04-02 06:30:19 +03:00
|
|
|
std::optional<string> ErrorInfo::programName = std::nullopt;
|
2020-03-22 20:25:47 +02:00
|
|
|
|
2020-03-23 23:29:49 +02:00
|
|
|
string showErrLine(ErrLine &errLine)
|
2020-03-22 20:25:47 +02:00
|
|
|
{
|
2020-04-07 19:14:15 +03:00
|
|
|
if (errLine.column > 0) {
|
|
|
|
return fmt("(%1%:%2%)", errLine.lineNumber, errLine.column);
|
2020-04-03 01:02:40 +03:00
|
|
|
} else {
|
2020-04-07 19:14:15 +03:00
|
|
|
return fmt("(%1%)", errLine.lineNumber);
|
2020-04-02 01:20:20 +03:00
|
|
|
};
|
2020-03-22 20:25:47 +02:00
|
|
|
}
|
|
|
|
|
2020-04-03 01:02:40 +03:00
|
|
|
void printCodeLines(string &prefix, NixCode &nixCode)
|
2020-03-22 20:25:47 +02:00
|
|
|
{
|
|
|
|
|
2020-04-03 01:02:40 +03:00
|
|
|
if (nixCode.errLine.has_value()) {
|
2020-04-02 01:20:20 +03:00
|
|
|
// previous line of code.
|
2020-04-03 01:02:40 +03:00
|
|
|
if (nixCode.errLine->prevLineOfCode.has_value()) {
|
2020-04-07 19:14:15 +03:00
|
|
|
std::cout << fmt("%1% %|2$5d|| %3%",
|
|
|
|
prefix,
|
|
|
|
(nixCode.errLine->lineNumber - 1),
|
|
|
|
*nixCode.errLine->prevLineOfCode)
|
2020-04-03 01:02:40 +03:00
|
|
|
<< std::endl;
|
2020-04-02 01:20:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// line of code containing the error.%2$+5d%
|
2020-04-07 19:14:15 +03:00
|
|
|
std::cout << fmt("%1% %|2$5d|| %3%",
|
|
|
|
prefix,
|
|
|
|
(nixCode.errLine->lineNumber),
|
|
|
|
nixCode.errLine->errLineOfCode)
|
2020-04-03 01:02:40 +03:00
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
// error arrows for the column range.
|
2020-04-07 19:14:15 +03:00
|
|
|
if (nixCode.errLine->column > 0) {
|
|
|
|
int start = nixCode.errLine->column;
|
2020-04-02 01:20:20 +03:00
|
|
|
std::string spaces;
|
2020-04-03 01:02:40 +03:00
|
|
|
for (int i = 0; i < start; ++i) {
|
2020-04-02 01:20:20 +03:00
|
|
|
spaces.append(" ");
|
|
|
|
}
|
|
|
|
|
2020-04-07 19:14:15 +03:00
|
|
|
// for now, length of 1.
|
|
|
|
std::string arrows("^");
|
2020-04-02 01:20:20 +03:00
|
|
|
|
2020-04-07 19:14:15 +03:00
|
|
|
std::cout << fmt("%1% |%2%" ANSI_RED "%3%" ANSI_NORMAL,
|
|
|
|
prefix,
|
|
|
|
spaces,
|
|
|
|
arrows) << std::endl;
|
2020-04-02 01:20:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// next line of code.
|
2020-04-03 01:02:40 +03:00
|
|
|
if (nixCode.errLine->nextLineOfCode.has_value()) {
|
2020-04-07 19:14:15 +03:00
|
|
|
std::cout << fmt("%1% %|2$5d|| %3%",
|
|
|
|
prefix,
|
|
|
|
(nixCode.errLine->lineNumber + 1),
|
|
|
|
*nixCode.errLine->nextLineOfCode)
|
2020-04-03 01:02:40 +03:00
|
|
|
<< std::endl;
|
2020-04-02 01:20:20 +03:00
|
|
|
}
|
2020-03-22 20:25:47 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-04-03 01:02:40 +03:00
|
|
|
void printErrorInfo(ErrorInfo &einfo)
|
2020-03-22 20:25:47 +02:00
|
|
|
{
|
2020-04-02 01:20:20 +03:00
|
|
|
int errwidth = 80;
|
|
|
|
string prefix = " ";
|
2020-03-22 20:25:47 +02:00
|
|
|
|
2020-04-02 01:20:20 +03:00
|
|
|
string levelString;
|
2020-04-03 01:02:40 +03:00
|
|
|
switch (einfo.level) {
|
|
|
|
case ErrLevel::elError: {
|
|
|
|
levelString = ANSI_RED;
|
|
|
|
levelString += "error:";
|
|
|
|
levelString += ANSI_NORMAL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case ErrLevel::elWarning: {
|
|
|
|
levelString = ANSI_YELLOW;
|
|
|
|
levelString += "warning:";
|
|
|
|
levelString += ANSI_NORMAL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default: {
|
2020-04-07 19:14:15 +03:00
|
|
|
levelString = fmt("invalid error level: %1%", einfo.level);
|
2020-04-03 01:02:40 +03:00
|
|
|
break;
|
|
|
|
}
|
2020-03-22 20:25:47 +02:00
|
|
|
}
|
|
|
|
|
2020-04-02 01:20:20 +03:00
|
|
|
int ndl = prefix.length() + levelString.length() + 3 + einfo.name.length() + einfo.programName.value_or("").length();
|
2020-04-03 01:02:40 +03:00
|
|
|
int dashwidth = ndl > (errwidth - 3) ? 3 : errwidth - ndl;
|
2020-04-02 01:20:20 +03:00
|
|
|
|
|
|
|
string dashes;
|
|
|
|
for (int i = 0; i < dashwidth; ++i)
|
|
|
|
dashes.append("-");
|
|
|
|
|
|
|
|
// divider.
|
2020-04-07 19:14:15 +03:00
|
|
|
std::cout << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL
|
|
|
|
, prefix
|
|
|
|
, levelString
|
|
|
|
, "---"
|
|
|
|
, einfo.name
|
|
|
|
, dashes
|
|
|
|
, einfo.programName.value_or(""))
|
2020-04-03 01:02:40 +03:00
|
|
|
<< std::endl;
|
2020-03-22 20:25:47 +02:00
|
|
|
|
2020-04-02 01:20:20 +03:00
|
|
|
// filename.
|
2020-04-03 01:02:40 +03:00
|
|
|
if (einfo.nixCode.has_value()) {
|
|
|
|
if (einfo.nixCode->nixFile.has_value()) {
|
2020-04-02 01:20:20 +03:00
|
|
|
string eline = einfo.nixCode->errLine.has_value()
|
2020-04-03 01:02:40 +03:00
|
|
|
? string(" ") + showErrLine(*einfo.nixCode->errLine)
|
|
|
|
: "";
|
2020-04-02 01:20:20 +03:00
|
|
|
|
2020-04-07 19:14:15 +03:00
|
|
|
std::cout << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL
|
|
|
|
, prefix, *einfo.nixCode->nixFile, eline) << std::endl;
|
2020-04-02 06:30:19 +03:00
|
|
|
std::cout << prefix << std::endl;
|
2020-04-03 01:02:40 +03:00
|
|
|
} else {
|
2020-04-07 19:14:15 +03:00
|
|
|
std::cout << fmt("%1%from command line argument", prefix) << std::endl;
|
2020-04-02 06:30:19 +03:00
|
|
|
std::cout << prefix << std::endl;
|
2020-04-02 01:20:20 +03:00
|
|
|
}
|
|
|
|
}
|
2020-03-22 20:25:47 +02:00
|
|
|
|
2020-04-02 01:20:20 +03:00
|
|
|
// description
|
2020-04-02 06:30:19 +03:00
|
|
|
std::cout << prefix << einfo.description << std::endl;
|
|
|
|
std::cout << prefix << std::endl;
|
2020-04-02 01:20:20 +03:00
|
|
|
|
|
|
|
// lines of code.
|
2020-04-03 01:02:40 +03:00
|
|
|
if (einfo.nixCode.has_value()) {
|
2020-04-02 01:20:20 +03:00
|
|
|
printCodeLines(prefix, *einfo.nixCode);
|
2020-04-02 06:30:19 +03:00
|
|
|
std::cout << prefix << std::endl;
|
2020-04-02 01:20:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// hint
|
2020-04-03 01:02:40 +03:00
|
|
|
if (einfo.hint.has_value()) {
|
2020-04-02 06:30:19 +03:00
|
|
|
std::cout << prefix << *einfo.hint << std::endl;
|
|
|
|
std::cout << prefix << std::endl;
|
2020-04-02 01:20:20 +03:00
|
|
|
}
|
2020-03-22 20:25:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|