#include "StaticPass.hpp" #include "lib/Node.hpp" #include "TypeResolver.hpp" namespace roza { /*explicit*/ StaticPass::StaticPass(StatusLog& log) : m_log { log } { } /*virtual*/ StaticPass::~StaticPass() { } void StaticPass::check(std::shared_ptr root) { TypeResolver resolver {m_log}; switch (root->type()) { case NODE_INT: break; case NODE_ADD: case NODE_SUB: case NODE_MUL: case NODE_DIV: case NODE_MOD: case NODE_POW: { auto lhs = resolver.find(root->child(0)); auto rhs = resolver.find(root->child(1)); if (!lhs->equals(*rhs)) { m_log.fatal(root->loc(), std::string() + "type mismatch, expected '" + lhs->string() + "', got '" + rhs->string() + "'"); } } break; case NODE_UADD: case NODE_USUB: { } break; case NODE_PROG: { for (size_t i=0; isize(); i++) { check(root->child(i)); } } break; default: m_log.fatal(root->loc(), "cannot check node '" + root->string() + "'"); } } }