lang/include/error_handling.hpp

71 lines
2.4 KiB
C++
Raw Normal View History

#pragma once
2023-07-23 19:40:27 +03:00
#include "basic_nodes.hpp"
#include "tree_sitter_wrapper.hpp"
#include "utils.hpp"
2023-07-23 19:40:27 +03:00
#include <iostream>
namespace error_handling {
inline void print_position(std::ostream &out,
std::pair<size_t, size_t> start_position,
std::pair<size_t, size_t> end_position) {
out << '[' << start_position.first + 1 << ", " << start_position.second + 1
<< "] - [" << end_position.first + 1 << ", " << end_position.second + 1
<< ']';
}
inline void handle_internal_error(const std::string &message,
const nodes::Node &node) {
std::cerr << "\x1b[1;31mInternal Error:\x1b[0m " << message << " at ";
print_position(std::cerr, node.get_start_position(), node.get_end_position());
std::cerr << ".\n";
exit(1);
}
inline void handle_internal_error(const std::string &message,
parser::ParseTree::Node node) {
std::cerr << "\x1b[1;31mInternal Error:\x1b[0m " << message << " at ";
print_position(std::cerr, node.get_start_point(), node.get_end_point());
std::cerr << ".\n";
exit(1);
}
inline void handle_parsing_error(const std::string &message,
parser::ParseTree::Node parse_node) {
std::cerr << "\x1b[1;31mParsing Error:\x1b[0m " << message << " at ";
print_position(std::cerr, parse_node.get_start_point(),
parse_node.get_end_point());
std::cerr << ".\n";
exit(1);
}
inline void handle_typecheck_error(const std::string &message,
nodes::Node node) {
std::cerr << "\x1b[1;31mTypecheck Error:\x1b[0m " << message << " at ";
print_position(std::cerr, node.get_start_position(), node.get_end_position());
std::cerr << ".\n";
exit(1);
}
inline void handle_runtime_error(const std::string &message, nodes::Node node) {
std::cerr << "\x1b[1;31mRuntime Error:\x1b[0m " << message << " at ";
print_position(std::cerr, node.get_start_position(), node.get_end_position());
std::cerr << ".\n";
exit(1);
}
inline void handle_names_error(const std::string &message, nodes::Node node) {
std::cerr << "\x1b[1;31mNames Error:\x1b[0m " << message << " at ";
print_position(std::cerr, node.get_start_position(), node.get_end_position());
std::cerr << ".\n";
exit(1);
}
template <typename T> inline void debug_print(const T &value) {
std::cerr << "\x1b[1;33mDebug:\x1b[0m " << value << '\n';
}
} // namespace error_handling