#pragma once #include "ir.hpp" #include "../parser/parser.hpp" #include "../typechecker/typechecker.hpp" #include #include namespace Solstice { struct IRContext { std::unordered_map variables; }; class IRBuilder { Node in; Program out; Context tcContext; IRContext* currentContext = nullptr; BasicBlock* currentBlock = nullptr; IRFunction* currentFunction = nullptr; void buildNode(Node& node); void buildRootNode(Node& node); void buildLiteralNode(Node& node); void buildIdentifierNode(Node& node); void buildFunctionBindNode(Node& node); public: IRBuilder() = delete; IRBuilder(const Node& node, const Context& context) : in(node), tcContext(context) {} void build(); void optimise(); Program& getProgram(); }; }