#pragma once #include "cps/TemplateAST.h" #include "cps/Identifier.h" #include namespace cps::detail { using TemplateBindings = IdentifierMap>; // Clones own all children; source ASTs remain reusable for later instances. class TemplateClone { const TemplateBindings &Bindings; IdentifierMap> PackNames; std::function Error; bool Failed = false; void fail(int Line, const std::string &Message); std::vector> arguments(const std::vector> &Args); std::vector> body(const std::vector> &Body); std::unique_ptr expression(ExprAST *Expr); std::unique_ptr statement(StmtAST *Stmt); public: TemplateClone(const TemplateBindings &Bindings, std::function Error) : Bindings(Bindings), Error(std::move(Error)) {} std::string type(const std::string &Name); std::unique_ptr function(const FunctionDefAST *Source, const std::string &Name, const std::string &OwnerClass = {}); std::unique_ptr klass(const ClassTypeDeclAST *Source, const std::string &Name); }; } // namespace cps::detail