From 88134802fa1ba67d6061556a1853d66e6fd8da59 Mon Sep 17 00:00:00 2001 From: Sam Vervaeck Date: Mon, 8 Apr 2024 19:58:00 +0200 Subject: [PATCH] Fix compile errors --- bootstrap/cxx/include/bolt/Program.hpp | 67 ++++++++++++++++++++++++++ bootstrap/cxx/src/main.cc | 27 ++++++----- 2 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 bootstrap/cxx/include/bolt/Program.hpp diff --git a/bootstrap/cxx/include/bolt/Program.hpp b/bootstrap/cxx/include/bolt/Program.hpp new file mode 100644 index 000000000..f1a29fcd6 --- /dev/null +++ b/bootstrap/cxx/include/bolt/Program.hpp @@ -0,0 +1,67 @@ + +#pragma once + +#include +#include +#include + +#include "bolt/Common.hpp" +#include "bolt/Checker.hpp" +#include "bolt/DiagnosticEngine.hpp" + +class SourceFile; + +namespace bolt { + +class Program { + + DiagnosticEngine& DE; + LanguageConfig Config; + + std::unordered_map SourceFiles; + std::unordered_map TCs; + +public: + + Program(DiagnosticEngine& DE, LanguageConfig Config = {}): + DE(DE), Config(Config) {} + + auto getSourceFiles() { + return zen::make_iterator_range(SourceFiles.begin(), SourceFiles.end()).map_second(); + } + + void addSourceFile(std::filesystem::path Path, SourceFile* SF) { + SourceFiles.emplace(Path, SF); + } + + DiagnosticEngine& getDiagnostics() { + return DE; + } + + void setDiagnostics(DiagnosticEngine& New) { + DE = New; + } + + Checker& getTypeChecker(SourceFile* SF) { + auto Match = TCs.find(SF); + if (Match != TCs.end()) { + return Match->second; + } + return TCs.emplace(SF, Checker { Config, DE }).first->second; + } + + void check() { + for (auto SF: getSourceFiles()) { + getTypeChecker(SF).check(SF); + } + } + + // ~Program() { + // for (auto [SF, TC]: TCs) { + // delete TC; + // } + // } + +}; + +} diff --git a/bootstrap/cxx/src/main.cc b/bootstrap/cxx/src/main.cc index f77c2f4f0..876dedf72 100644 --- a/bootstrap/cxx/src/main.cc +++ b/bootstrap/cxx/src/main.cc @@ -18,6 +18,7 @@ #include "bolt/Parser.hpp" #include "bolt/Checker.hpp" #include "bolt/Evaluator.hpp" +#include "bolt/Program.hpp" using namespace bolt; @@ -72,9 +73,10 @@ int main(int Argc, const char* Argv[]) { ConsolePrinter ThePrinter; ConsoleDiagnostics DE(ThePrinter); + DiagnosticStore DS; LanguageConfig Config; - std::vector SourceFiles; + Program Prog { DirectDiagnostics ? static_cast(DE) : DS, Config }; for (auto Filename: Submatch->get_pos_args()) { @@ -92,15 +94,10 @@ int main(int Argc, const char* Argv[]) { SF->setParents(); - SourceFiles.push_back(SF); + Prog.addSourceFile(Filename, SF); } - DiagnosticStore DS; - Checker TheChecker { Config, DirectDiagnostics ? static_cast(DE) : static_cast(DS) }; - - for (auto SF: SourceFiles) { - TheChecker.check(SF); - } + Prog.check(); if (IsVerify) { @@ -109,8 +106,10 @@ int main(int Argc, const char* Argv[]) { bool HasError = 0; struct AssertVisitor : public CSTVisitor { + Checker& C; DiagnosticEngine& DE; + void visitExpression(Expression* N) { for (auto A: N->Annotations) { if (A->getKind() == NodeKind::TypeAssertAnnotation) { @@ -124,15 +123,18 @@ int main(int Argc, const char* Argv[]) { } visitEachChild(N); } + }; - AssertVisitor V { {}, TheChecker, DE }; - for (auto SF: SourceFiles) { + for (auto SF: Prog.getSourceFiles()) { + AssertVisitor V { {}, Prog.getTypeChecker(SF), DE }; V.visit(SF); } struct ExpectDiagnosticVisitor : public CSTVisitor { + std::multimap Expected; + void visitExpressionAnnotation(ExpressionAnnotation* N) { if (N->getExpression()->is()) { auto CE = static_cast(N->getExpression()); @@ -145,10 +147,11 @@ int main(int Argc, const char* Argv[]) { } } } + }; ExpectDiagnosticVisitor V1; - for (auto SF: SourceFiles) { + for (auto SF: Prog.getSourceFiles()) { V1.visit(SF); } @@ -192,7 +195,7 @@ int main(int Argc, const char* Argv[]) { std::cerr << Args[0].asString() << "\n"; return Value::unit(); })); - for (auto SF: SourceFiles) { + for (auto SF: Prog.getSourceFiles()) { // TODO add a SourceFile-local env that inherits from GlobalEnv E.evaluate(SF, GlobalEnv); }