summaryrefslogtreecommitdiff
path: root/tiger-compiler/src/testsuite/tasks.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tiger-compiler/src/testsuite/tasks.cc')
-rw-r--r--tiger-compiler/src/testsuite/tasks.cc49
1 files changed, 49 insertions, 0 deletions
diff --git a/tiger-compiler/src/testsuite/tasks.cc b/tiger-compiler/src/testsuite/tasks.cc
new file mode 100644
index 0000000..c7f1164
--- /dev/null
+++ b/tiger-compiler/src/testsuite/tasks.cc
@@ -0,0 +1,49 @@
+/**
+ ** \file testsuite/tasks.hh
+ ** \brief Testsuite module related tasks' implementation.
+ */
+
+#include <parse/libparse.hh>
+#include <parse/tweast.hh>
+#include <testsuite/libtestsuite.hh>
+
+#include <ast/tasks.hh>
+#include <parse/tasks.hh>
+#define DEFINE_TASKS 1
+#include <testsuite/tasks.hh>
+#undef DEFINE_TASKS
+
+namespace testsuite::tasks
+ {
+
+ void add_testsuite_runtime()
+ {
+ /**
+ * A testsuite being a series of function declaration, the prelude is
+ * not included by default. As such, we need to insert it on our own
+ * within the AST.
+ */
+ parse::Tweast new_program;
+
+ const auto prelude = parse::parse_prelude();
+ const auto current_program = ast::tasks::the_program.release();
+
+ const auto tests = find_program_tests(*current_program);
+
+ const auto testsuite_runtime = create_testsuite_runtime(tests);
+
+ current_program->emplace_back(testsuite_runtime);
+
+ if (prelude != nullptr)
+ {
+ new_program << prelude;
+ }
+
+ new_program << current_program;
+
+ const auto new_ast = parse::parse(new_program);
+
+ ast::tasks::the_program = std::unique_ptr<ast::ChunkList>{new_ast};
+ }
+
+ } // namespace testsuite