11#ifndef INCLUDE_ARK_EXCEPTIONS_HPP
12#define INCLUDE_ARK_EXCEPTIONS_HPP
35 explicit Error(
const std::string& message) :
36 std::runtime_error(message)
39 [[nodiscard]]
virtual std::string
details(
bool colorize [[maybe_unused]])
const
65 Error(
"AssertionFailed: " + message)
74 m_details(e.details( false))
76 if (!m_details.empty() && m_details.back() !=
'\n')
78 m_details +=
"\n" + details;
81 NestedError(
const std::exception& e,
const std::string& details) :
85 if (!m_details.empty() && m_details.back() !=
'\n')
87 m_details +=
"\n" + details;
90 [[nodiscard]]
const char*
what() const noexcept
override
92 return m_details.c_str();
105 const std::optional<internal::utf8_char_t>
symbol;
106 const bool is_macro_expansion =
false;
108 CodeErrorContext(std::string filename_,
const std::size_t lineNum,
const std::size_t column, std::string expression,
const std::optional<internal::utf8_char_t> maybe_symbol = std::nullopt) :
109 filename(std::move(filename_)),
112 expr(std::move(expression)),
116 CodeErrorContext(std::string filename_,
const std::size_t lineNum,
const std::size_t column, std::string expression,
const bool from_macro_expansion) :
117 filename(std::move(filename_)),
120 expr(std::move(expression)),
121 symbol(std::nullopt),
122 is_macro_expansion(from_macro_expansion)
137 context(std::move(ctx)),
138 additional_context(std::move(maybe_more_context))
142 namespace Diagnostics
159 const std::string& filename,
160 const std::optional<std::string>& expr,
161 std::size_t sym_size,
162 std::size_t target_line,
163 std::size_t col_start,
164 const std::optional<CodeErrorContext>& maybe_context,
An assertion error, only triggered from ArkScript code through (assert expr error-message)
AssertionFailed(const std::string &message)
virtual std::string details(bool colorize) const
Error(const std::string &message)
NestedError(const Error &e, const std::string &details)
NestedError(const std::exception &e, const std::string &details)
const char * what() const noexcept override
A type error triggered when types don't match.
TypeError(const std::string &message)
A node of an Abstract Syntax Tree for ArkScript.
ARK_API void generate(const CodeError &e, std::ostream &os=std::cout, bool colorize=true)
Generate a diagnostic from an error and print it to the standard output.
ARK_API std::string makeContextWithNode(const std::string &message, const internal::Node &node)
Helper used by the compiler to generate a colorized context from a node.
ARK_API void makeContext(std::ostream &os, const std::string &filename, const std::optional< std::string > &expr, std::size_t sym_size, std::size_t target_line, std::size_t col_start, const std::optional< CodeErrorContext > &maybe_context, bool whole_line, bool colorize)
Helper to create a colorized context to report errors to the user.
CodeErrorContext(std::string filename_, const std::size_t lineNum, const std::size_t column, std::string expression, const std::optional< internal::utf8_char_t > maybe_symbol=std::nullopt)
const std::string filename
const std::optional< internal::utf8_char_t > symbol
CodeErrorContext(std::string filename_, const std::size_t lineNum, const std::size_t column, std::string expression, const bool from_macro_expansion)
CodeError thrown by the compiler (parser, macro processor, optimizer, and compiler itself)
const std::optional< CodeErrorContext > additional_context
const CodeErrorContext context
CodeError(const std::string &what, CodeErrorContext ctx, std::optional< CodeErrorContext > maybe_more_context=std::nullopt)