From 19116dcbd00a9bbf9b0dd8ae32433a1c104755c5 Mon Sep 17 00:00:00 2001 From: augustin64 Date: Thu, 4 Jan 2024 19:31:48 +0100 Subject: [PATCH] Pretty print stack trace --- src/errors.cpp | 24 +++++++++++++++++++----- src/include/errors.h | 5 +++++ src/include/utils.h | 5 +++++ src/main.cpp | 7 +------ src/utils.cpp | 10 ++++++++++ 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/errors.cpp b/src/errors.cpp index 0503704..53308b9 100644 --- a/src/errors.cpp +++ b/src/errors.cpp @@ -1,8 +1,10 @@ #include #include +#include #include using namespace std; +#include "include/utils.h" #include "include/errors.h" #include "include/colors.h" #include "include/tokenize.h" @@ -60,14 +62,26 @@ void print_error_position(vector history, CodePosition pos) { if (pos.column == -1 || pos.line == -1) return; - cout << endl; - string line = history[pos.line]; - - printf(BOLD "%4d " RESET , pos.line+1); - cout << line << endl; + cout << endl << BOLD + << setw(4) << setfill(' ') + << pos.line+1 << " " RESET + << history[pos.line] << endl; for (int i=0; i < pos.column + 5; i++) cout << " "; cout << BOLD RED "^--" RESET << endl; +} + +void print_error_stack_trace(vector history, const RuntimeError& error) { + cout << "\n" BOLD "Traceback" RESET " (most recent call last)" << endl; + for (StackTraceEntry e : error.trace) { + cout << BOLD << setw(4) << setfill(' ') + << get<1>(e).line+1 << RESET BLUE + << setw(16) << setfill(' ') + << get<0>(e) << RESET << "\t" + << trim(history[get<1>(e).line]) << endl; + } + + cout << BOLD RED "Runtime Error: " RESET << error.get_message() << endl; } \ No newline at end of file diff --git a/src/include/errors.h b/src/include/errors.h index 408bc5a..4e27a0c 100644 --- a/src/include/errors.h +++ b/src/include/errors.h @@ -115,4 +115,9 @@ public: */ void print_error_position(vector history, CodePosition pos); +/** + * Display the stack trace associated with an error +*/ +void print_error_stack_trace(vector history, const RuntimeError& error); + #endif \ No newline at end of file diff --git a/src/include/utils.h b/src/include/utils.h index 6e9a1f3..be847ed 100644 --- a/src/include/utils.h +++ b/src/include/utils.h @@ -39,4 +39,9 @@ string _debug_get_type_type_name(TypeType type); */ bool equal_types(Type type1, Type type2); +/** + * Trim a string (remove whitespaces before and after) +*/ +string trim(const string& str); + #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index a8fc983..780ef16 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -119,12 +119,7 @@ int main(int argc, char* argv[]) { cout << BOLD RED "Type Error: " RESET << e.get_message() << endl; } catch (const RuntimeError& e) { - print_error_position(input, e.pos); - cout << BOLD RED "Runtime Error: " RESET << e.get_message() << endl; - - for (StackTraceEntry e : e.trace) { - cout << get<0>(e) << " " << (get<1>(e).line + 1) << endl; - } + print_error_stack_trace(input, e); } cout << endl; } diff --git a/src/utils.cpp b/src/utils.cpp index a169ef2..022154d 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -111,4 +111,14 @@ bool equal_types(Type type1, Type type2) { return false; break; } +} + +string trim(const string& str) { + size_t first = str.find_first_not_of(" \t\n\r"); + size_t last = str.find_last_not_of(" \t\n\r"); + + if (first == string::npos || last == string::npos) + return ""; // or handle empty string + + return str.substr(first, last - first + 1); } \ No newline at end of file