From d81f82c81858171702f031d672421acfbd149171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Sat, 5 Jul 2025 23:10:52 +0900 Subject: [PATCH] Handle errors through logger and error class in module builder --- src/Compiler/ModuleBuilder.cpp | 36 ++++++++++++++++++++++------------ src/Compiler/ModuleBuilder.h | 1 - src/Logger.cpp | 3 ++- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index d8f0710..5777fe5 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -1,6 +1,7 @@ #include "ModuleBuilder.h" #include "Error.h" +#include "Logger.h" #include "Parser/ValueType.h" #include "Parser/Expression/ExpressionGrouping.h" @@ -37,6 +38,13 @@ shared_ptr ModuleBuilder::getModule() { scopes.push(Scope()); for (shared_ptr &statement : statements) buildStatement(statement); + + if (!errors.empty()) { + for (shared_ptr &error : errors) + Logger::print(error); + exit(1); + } + return module; } @@ -67,7 +75,7 @@ void ModuleBuilder::buildStatement(shared_ptr statement) { buildExpression(dynamic_pointer_cast(statement)); return; default: - failWithMessage("Unexpected statement"); + markError(0, 0, "Unexpected statement"); } } @@ -114,7 +122,7 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptr state string errorMessage; llvm::raw_string_ostream llvmErrorMessage(errorMessage); if (llvm::verifyFunction(*fun, &llvmErrorMessage)) - failWithMessage(errorMessage); + markError(0, 0, errorMessage); } void ModuleBuilder::buildVarDeclaration(shared_ptr statement) { @@ -237,7 +245,8 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr expression case ExpressionKind::CALL: return valueForCall(dynamic_pointer_cast(expression)); default: - failWithMessage("Unexpected expression"); + markError(0, 0, "Unexpected expression"); + return nullptr; } } @@ -275,7 +284,8 @@ llvm::Value *ModuleBuilder::valueForBinary(shared_ptr expressi return valueForBinaryReal(expression->getOperation(), leftValue, rightValue); } - failWithMessage("Unexpected operation"); + markError(0, 0, "Unexpected operation"); + return nullptr; } llvm::Value *ModuleBuilder::valueForBinaryBool(ExpressionBinaryOperation operation, llvm::Value *leftValue, llvm::Value *rightValue) { @@ -285,7 +295,8 @@ llvm::Value *ModuleBuilder::valueForBinaryBool(ExpressionBinaryOperation operati case ExpressionBinaryOperation::NOT_EQUAL: return builder->CreateICmpNE(leftValue, rightValue); default: - failWithMessage("Undefined operation for boolean operands"); + markError(0, 0, "Unexpecgted operation for boolean operands"); + return nullptr; } } @@ -417,8 +428,10 @@ llvm::Value *ModuleBuilder::valueForCall(shared_ptr expression) } bool ModuleBuilder::setAlloca(string name, llvm::AllocaInst *alloca) { - if (scopes.top().allocaMap[name] != nullptr) + if (scopes.top().allocaMap[name] != nullptr) { + markError(0, 0, format("Variable \"{}\" already defined", name)); return false; + } scopes.top().allocaMap[name] = alloca; return true; @@ -434,12 +447,15 @@ llvm::AllocaInst* ModuleBuilder::getAlloca(string name) { scopes.pop(); } + markError(0, 0, format("Variable \"{}\" not defined in scope", name)); return nullptr; } bool ModuleBuilder::setFun(string name, llvm::Function *fun) { - if (scopes.top().funMap[name] != nullptr) + if (scopes.top().funMap[name] != nullptr) { + markError(0, 0, format("Function \"{}\" already defined", name)); return false; + } scopes.top().funMap[name] = fun; return true; @@ -455,6 +471,7 @@ llvm::Function* ModuleBuilder::getFun(string name) { scopes.pop(); } + markError(0, 0, format("Function \"{}\" not defined in scope", name)); return nullptr; } @@ -471,11 +488,6 @@ llvm::Type *ModuleBuilder::typeForValueType(shared_ptr valueType) { } } -void ModuleBuilder::failWithMessage(string message) { - cerr << "Error! Building module \"" << moduleName << "\" from \"" + sourceFileName + "\" failed:" << endl << message << endl; - exit(1); -} - void ModuleBuilder::markError(int line, int column, string message) { errors.push_back(Error::builderError(line, column, message)); } diff --git a/src/Compiler/ModuleBuilder.h b/src/Compiler/ModuleBuilder.h index 2148c2e..ddc70df 100644 --- a/src/Compiler/ModuleBuilder.h +++ b/src/Compiler/ModuleBuilder.h @@ -86,7 +86,6 @@ private: llvm::Function *getFun(string name); llvm::Type *typeForValueType(shared_ptr valueType); - void failWithMessage(string message); void markError(int line, int column, string message); diff --git a/src/Logger.cpp b/src/Logger.cpp index 4863089..b776a35 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -447,7 +447,8 @@ void Logger::print(shared_ptr error) { break; } case ErrorKind::BUILDER_ERROR: { - message = ""; + string errorMessage = error->getMessage() ? *(error->getMessage()) : ""; + message = format("Error at line {}, column {}: {}", error->getLine(), error->getColumn(), errorMessage); break; } }