diff --git a/Changelog.md b/Changelog.md index 69c3573fc..2ab1bb037 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ Language Features: Compiler Features: * Commandline Interface: Accept nested brackets in step sequences passed to ``--yul-optimizations``. * Commandline Interface: Add ``--debug-info`` option for selecting how much extra debug information should be included in the produced EVM assembly and Yul code. + * Commandline Interface: Use different colors when printing errors, warnings and infos. * SMTChecker: Output values for ``block.*``, ``msg.*`` and ``tx.*`` variables that are present in the called functions. * Standard JSON: Accept nested brackets in step sequences passed to ``settings.optimizer.details.yulDetails.optimizerSteps``. * Standard JSON: Add ``settings.debug.debugInfo`` option for selecting how much extra debug information should be included in the produced EVM assembly and Yul code. diff --git a/liblangutil/Exceptions.cpp b/liblangutil/Exceptions.cpp index 02dbdb3a5..a410a9863 100644 --- a/liblangutil/Exceptions.cpp +++ b/liblangutil/Exceptions.cpp @@ -23,6 +23,9 @@ #include +#include +#include + using namespace std; using namespace solidity; using namespace solidity::langutil; @@ -72,17 +75,14 @@ Error::Error( *this << util::errinfo_comment(_description); } -static optional severityFromString(string _severity) +optional Error::severityFromString(string _input) { - boost::algorithm::to_lower(_severity); + boost::algorithm::to_lower(_input); + boost::algorithm::trim(_input); - _severity = boost::algorithm::trim_copy(_severity); + for (Severity severity: {Severity::Error, Severity::Warning, Severity::Info}) + if (_input == formatErrorSeverityLowercase(severity)) + return severity; - if (_severity == formatErrorSeverityLowercase(Severity::Error)) { return Severity::Error; } - - else if (_severity == formatErrorSeverityLowercase(Severity::Warning)) { return Severity::Warning; } - - else if (_severity == formatErrorSeverityLowercase(Severity::Info)) { return Severity::Info; } - - else return std::make_optional(_severity).has_value() ? std::optional(_severity) : std::nullopt; -} \ No newline at end of file + return nullopt; +} diff --git a/liblangutil/Exceptions.h b/liblangutil/Exceptions.h index 3ed8c8b2e..0c8f03cb9 100644 --- a/liblangutil/Exceptions.h +++ b/liblangutil/Exceptions.h @@ -111,6 +111,7 @@ struct InvalidAstError: virtual util::Exception {}; "AST assertion failed" \ ) + using errorSourceLocationInfo = std::pair; class SecondarySourceLocation @@ -205,8 +206,6 @@ public: return nullptr; } - static std::optional severityFromString(std::string _severity); - static Severity errorSeverity(Type _type) { if (_type == Type::Info) @@ -259,6 +258,8 @@ public: solAssert(false, ""); } + static std::optional severityFromString(std::string _input); + private: ErrorId m_errorId; Type m_type; diff --git a/liblangutil/SourceReferenceFormatter.cpp b/liblangutil/SourceReferenceFormatter.cpp index 8ca479b6b..0edd551b8 100644 --- a/liblangutil/SourceReferenceFormatter.cpp +++ b/liblangutil/SourceReferenceFormatter.cpp @@ -65,24 +65,21 @@ AnsiColorized SourceReferenceFormatter::frameColored() const return AnsiColorized(m_stream, m_colored, {BOLD, BLUE}); } -AnsiColorized SourceReferenceFormatter::errorColored() const +AnsiColorized SourceReferenceFormatter::errorColored(optional _severity) const { - return AnsiColorized(m_stream, m_colored, {BOLD, RED}); -} + // We used to color messages of any severity as errors so this seems like a good default + // for cases where severity cannot be determined. + char const* textColor = RED; -AnsiColorized SourceReferenceFormatter::infoColored() const -{ - return AnsiColorized(m_stream, m_colored, {BOLD, WHITE}); -} + if (_severity.has_value()) + switch (_severity.value()) + { + case Error::Severity::Error: textColor = RED; break; + case Error::Severity::Warning: textColor = YELLOW; break; + case Error::Severity::Info: textColor = WHITE; break; + } -AnsiColorized SourceReferenceFormatter::warningColored() const -{ - return AnsiColorized(m_stream, m_colored, {BOLD, YELLOW}); -} - -AnsiColorized SourceReferenceFormatter::unknownColored() const -{ - return AnsiColorized(m_stream, m_colored, {BOLD, WHITE}); + return AnsiColorized(m_stream, m_colored, {BOLD, textColor}); } AnsiColorized SourceReferenceFormatter::messageColored() const @@ -179,22 +176,11 @@ void SourceReferenceFormatter::printSourceLocation(SourceReference const& _ref) void SourceReferenceFormatter::printExceptionInformation(SourceReferenceExtractor::Message const& _msg) { // exception header line - if (_msg.errorId.has_value()) - { - switch(severityFromString(_msg.severity)) - { - case Severity::Error : errorColored() << " (" << _msg.errorId.value().error << ")"; - break; - - case Severity::Warning : warningColored() << " (" << _msg.errorId.value().error << ")"; - break; - - case Severity::Info : infoColored() << " (" << _msg.errorId.value().error << ")"; - break; - - default : unknownColored() << " (" << _msg.errorId.value().error << ")"; - } - } + optional severity = Error::severityFromString(_msg.severity); + errorColored(severity) << _msg.severity; + if (m_withErrorIds && _msg.errorId.has_value()) + errorColored(severity) << " (" << _msg.errorId.value().error << ")"; + messageColored() << ": " << _msg.primary.message << '\n'; printSourceLocation(_msg.primary); @@ -222,4 +208,4 @@ void SourceReferenceFormatter::printErrorInformation(ErrorList const& _errors) void SourceReferenceFormatter::printErrorInformation(Error const& _error) { printExceptionInformation(SourceReferenceExtractor::extract(m_charStreamProvider, _error)); -} \ No newline at end of file +} diff --git a/liblangutil/SourceReferenceFormatter.h b/liblangutil/SourceReferenceFormatter.h index 5bac03a9a..e18400b60 100644 --- a/liblangutil/SourceReferenceFormatter.h +++ b/liblangutil/SourceReferenceFormatter.h @@ -87,7 +87,7 @@ public: private: util::AnsiColorized normalColored() const; util::AnsiColorized frameColored() const; - util::AnsiColorized errorColored() const; + util::AnsiColorized errorColored(std::optional _severity) const; util::AnsiColorized messageColored() const; util::AnsiColorized secondaryColored() const; util::AnsiColorized highlightColored() const;