#ifndef GODOTSCRIPT_HPP #define GODOTSCRIPT_HPP using namespace StandardComponents; struct GsTarget: Target { print_functions_pair printFunctions() final { return make_pair("printraw", "print"); } unordered_task_map getTaskMap() final { return { make_task(Define, const optional previous = parsedTree.findReferenceByName>(parseComponent.name); if (previous.has_value() and &previous.value().get() == &parseComponent) { // TODO Recursively traverse the parsedTree's parents and their parents to find existing definitions and do it in semantic analysis output << "var "; } else if (parseComponent.final) { output << "const "; } output << parseComponent.name << " = "; transpileTree(parseComponent.content); ), make_task(types::String, stringInterpolation(R"(""")", parseComponent.content);), make_task(Function, output << "func " << parseComponent.name << '('; separate_transpileTree(parseComponent.parameters, ", "); output << "):" << separator << indentation; if (parseComponent.empty()) output << "pass"; separate_transpileTree(parseComponent, 1); ), make_task(Condition::Statement, output << "if ("; transpileTree(parseComponent.condition); output << "):" << separator << indentation; if (parseComponent.empty()) output << "pass"; separate_transpileTree(parseComponent, 1); if (not parseComponent.else_branches.empty()) { output << separator; separate_transpileTree(parseComponent.else_branches); } ), make_task(Condition::Statement::Branch, if (parseComponent.is_conditional()) { output << "elif ("; transpileTree(parseComponent.condition); output << ")"; } else output << "else"; output << ':' << separator << indentation; separate_transpileTree(parseComponent, 1); if (parseComponent.empty()) output << "pass"; ) }; } using Target::Target; }; #endif