diff options
Diffstat (limited to 'willow/tools/willowc/lib/compiler.cpp')
| -rw-r--r-- | willow/tools/willowc/lib/compiler.cpp | 66 |
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 |