summaryrefslogtreecommitdiff
path: root/willow/tools/willowc/lib/compiler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'willow/tools/willowc/lib/compiler.cpp')
-rw-r--r--willow/tools/willowc/lib/compiler.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/willow/tools/willowc/lib/compiler.cpp b/willow/tools/willowc/lib/compiler.cpp
new file mode 100644
index 0000000..b933f65
--- /dev/null
+++ b/willow/tools/willowc/lib/compiler.cpp
@@ -0,0 +1,66 @@
+#include <compiler.hpp>
+
+#include <willow/IR/Diagnostic.h>
+#include <willow/IR/Location.h>
+#include <willow/Util/Color.h>
+
+#include <parser.hpp>
+
+#include <iostream>
+#include <print>
+
+namespace willowc {
+
+Compiler::Compiler()
+ : sourcemanager_(), log_level_(willow::Severity::Error),
+ diagnostic_engine_([this](const willow::Diagnostic &d) { emitDiagnostic(d); }) {}
+
+void Compiler::run() {
+ assert(sourcemanager_.numFiles() == 1);
+ Compiler::compile(0);
+}
+
+void Compiler::compile(FileID file) {
+ Parser parser{sourcemanager_.getFile(file), diagnostic_engine_};
+
+ auto x = parser.run();
+}
+
+void Compiler::emitDiagnostic(const willow::Diagnostic &d) {
+ using namespace willow::termcolor;
+ if (log_level_ > d.severity)
+ return;
+
+ if (d.location) {
+ std::print(std::cerr, "{}{}: ", TextStyle{AnsiColor::None, Emphasis::Bold},
+ d.location.value());
+ }
+
+ std::print(std::cerr, "{}{}: {}{}{}\n", willow::getSeverityColor(d.severity),
+ willow::getSeverityName(d.severity),
+ TextStyle{AnsiColor::Default, Emphasis::Bold}, d.message, TextStyle{});
+ // TODO: trace
+}
+
+willow::LogicalResult Compiler::addSourceFile(const std::string &path) {
+ std::optional<FileID> maybe_source_file = sourcemanager_.addFile(path);
+ if (!maybe_source_file) {
+ std::println(std::cerr, "error: failed to open input file '{}'", path);
+ return willow::failure();
+ }
+
+ return willow::success();
+}
+
+willow::LogicalResult Compiler::addStdIn() {
+ std::optional<FileID> maybestdin = sourcemanager_.addStdIn();
+
+ if (!maybestdin) {
+ std::println(std::cerr, "error: failed to read from stdin");
+ return willow::failure();
+ }
+
+ return willow::success();
+}
+
+}; // namespace willowc