diff --git a/furc/include/furc/ast/fwd.hpp b/furc/include/furc/ast/fwd.hpp index a98d42a..8b44911 100644 --- a/furc/include/furc/ast/fwd.hpp +++ b/furc/include/furc/ast/fwd.hpp @@ -36,6 +36,15 @@ struct error { * @return true if the errors are not equal. */ bool operator!=(const error& other) const { return !this->operator==(other); } + + /** + * @brief Prints an AST error to output stream. + * + * @param os Output stream. + * @param error AST error to print. + * @return The output stream. + */ + friend std::ostream& operator<<(std::ostream& os, const error& error); }; class node; diff --git a/furc/src/ast.cpp b/furc/src/ast.cpp index 7c539b5..cd3cde6 100644 --- a/furc/src/ast.cpp +++ b/furc/src/ast.cpp @@ -8,6 +8,10 @@ namespace furc::ast { +std::ostream& operator<<(std::ostream& os, const error& error) { + return os << error.location << ": ERROR: unknown"; +} + bool literal_node::equal(const node& rhs) const { return literal_type() == reinterpret_cast(rhs).literal_type(); } @@ -47,8 +51,8 @@ void var_read_expression_node::accept(visitor& visitor) const { } std::ostream& var_read_expression_node::print(std::ostream& os) const { - if (m_name.present()) return os << *m_name; - return os << m_name.error(); + if (m_name.has_error()) return os << m_name.error(); + return os << *m_name; } bool var_read_expression_node::equal(const node& rhsNode) const { @@ -162,7 +166,7 @@ std::ostream& function_definition_node::print(std::ostream& os) const { os << entry << '\n'; return os << m_body->end << ": " << p_name->string << " end"; } - return os << m_body.error().location << ": ERROR: unknown"; + return os << m_body.error(); } bool function_definition_node::equal(const node& rhs) const {