#include #include #include #include #include #include #include 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 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 maybestdin = sourcemanager_.addStdIn(); if (!maybestdin) { std::println(std::cerr, "error: failed to read from stdin"); return willow::failure(); } return willow::success(); } }; // namespace willowc