diff --git a/lang/builders/include/builders_utils.hpp b/lang/builders/include/builders_utils.hpp new file mode 100644 index 0000000..ec17a44 --- /dev/null +++ b/lang/builders/include/builders_utils.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include "executor.hpp" +#include "name_tree.hpp" +#include "nodes_storage.hpp" + +namespace builders { + +using Code = parser::ParseTree; +using Exprs = nodes::ExpressionStorage; +using Types = nodes::TypeStorage; +using Names = names::NameTree; + +using Executor = utils::Executor; + +using Node = nodes::Node_>; // TODO + +template +using Task = utils::Task; + +template struct BuilderTask { + static_assert(false); +}; + +template struct BuilderTaskBase : public Task { + using Task::Task; + + template + OtherN Run(const parser::ParseTree::Node &node, + const utils::None &args = {}) { + BuilderTask task(this->executor); + return task(node, args); + } +}; + +// TODO +// template <> +// struct BuilderTask +// : public BuilderTaskBase { +// using BuilderTaskBase::BuilderTaskBase; + +// nodes::ExpressionProxy operator()(const parser::ParseTree::Node &expr, +// const utils::None &args) override; +// }; + +} // namespace builders diff --git a/lang/utils/include/executor.hpp b/lang/utils/include/executor.hpp index ad588ac..4ea51d9 100644 --- a/lang/utils/include/executor.hpp +++ b/lang/utils/include/executor.hpp @@ -4,6 +4,8 @@ namespace utils { +struct None {}; + template class Task; template class ExecutorState { @@ -39,7 +41,8 @@ private: Log log_; }; -template class Task { +template +class Task { public: Task(Exec &executor) : executor(executor) {} @@ -47,14 +50,15 @@ public: // - // template Ret Run(const N& node, NArgs&& args) { + // template Ret Run(const N& node, NArgs&& args) + // { // Task task(executor); // return task(node, std::forward(args)); // } // - virtual Ret operator()(const Node& node, const Args& args) = 0; + virtual Ret operator()(const Node &node, const Args &args = {}) = 0; //