#include "ast/ast.hpp" #include "lexer/lexer.hpp" #include "parser/parser.hpp" #include #include void check_parser_errors(const std::vector&); namespace { template T* cast_impl(Base* base) { static_assert( std::is_base_of_v, "T must be derived from Base" ); T* t; REQUIRE_NOTHROW(t = dynamic_cast(base)); REQUIRE_MESSAGE( t != nullptr, "Couldn't cast expression to a " * std::string(typeid(T).name()) ); return t; } } // namespace // Overloads for your known base types template T* cast(ast::expression* expr) { return cast_impl(expr); } template T* cast(ast::statement* stmt) { return cast_impl(stmt); } template T* cast(ast::error::error* err) { return cast_impl(err); } struct ParserFixture { std::stringstream input; lexer::lexer* lexer = nullptr; parser::parser* parser = nullptr; ast::program* program = nullptr; ParserFixture() = default; void setup(std::string); ~ParserFixture(); };