From 9a186053a690f2216b43355549c8aa7e2959583c Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Fri, 18 Apr 2025 20:53:59 +0000
Subject: [PATCH] better error reporting
---
src/Interpreter/AssignmentStatementNode.hpp | 49 ++++++++++++++++++++++++++++++-------------------
1 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/src/Interpreter/AssignmentStatementNode.hpp b/src/Interpreter/AssignmentStatementNode.hpp
index 5f4a969..c5eeabc 100644
--- a/src/Interpreter/AssignmentStatementNode.hpp
+++ b/src/Interpreter/AssignmentStatementNode.hpp
@@ -2,6 +2,8 @@
#define INTERPRETER_ASSIGNMENT_STATEMENT_NODE_HPP
#include "StatementNode.hpp"
+// Include for unified runtime Exception
+#include "Interpreter/Interpreter.hpp"
#include "ExpressionNode.hpp"
#include "Symbols/SymbolContainer.hpp"
#include "Symbols/Value.hpp"
@@ -36,9 +38,9 @@
const std::string base_ns = symContainer->currentScopeName();
const std::string var_ns = base_ns + ".variables";
if (!symContainer->exists(targetName_, var_ns)) {
- throw std::runtime_error("Variable '" + targetName_ + "' does not exist in namespace: " + var_ns +
- " File: " + filename_ + ", Line: " + std::to_string(line_) +
- ", Column: " + std::to_string(column_));
+ throw Exception(
+ "Variable '" + targetName_ + "' does not exist in namespace: " + var_ns,
+ filename_, line_, column_);
}
auto symbol = symContainer->get(var_ns, targetName_);
// Copy current value for potential nested updates
@@ -48,20 +50,22 @@
// Simple variable assignment
if (propertyPath_.empty()) {
// Type check
- if (newValue.getType() != varValue.getType()) {
- using namespace Variables;
- throw std::runtime_error("Type mismatch assigning to variable '" + targetName_ +
- "': expected '" + TypeToString(varValue.getType()) +
- "' but got '" + TypeToString(newValue.getType()) +
- "' File: " + filename_ + ", Line: " + std::to_string(line_) +
- ", Column: " + std::to_string(column_));
- }
+ if (newValue.getType() != varValue.getType()) {
+ using namespace Variables;
+ throw Exception(
+ "Type mismatch assigning to variable '" + targetName_ +
+ "': expected '" + TypeToString(varValue.getType()) +
+ "' but got '" + TypeToString(newValue.getType()) + "'",
+ filename_, line_, column_);
+ }
symbol->setValue(newValue);
return;
}
// Nested object property assignment
if (varValue.getType() != Variables::Type::OBJECT) {
- throw std::runtime_error("Attempting to assign property on non-object variable '" + targetName_ + "'");
+ throw Exception(
+ "Attempting to assign property on non-object variable '" + targetName_ + "'",
+ filename_, line_, column_);
}
// Traverse into nested maps
using ObjectMap = Value::ObjectMap;
@@ -71,11 +75,15 @@
const auto & key = propertyPath_[i];
auto it = currMap->find(key);
if (it == currMap->end()) {
- throw std::runtime_error("Property '" + key + "' not found on object '" + targetName_ + "'");
+ throw Exception(
+ "Property '" + key + "' not found on object '" + targetName_ + "'",
+ filename_, line_, column_);
}
Value & child = it->second;
if (child.getType() != Variables::Type::OBJECT) {
- throw std::runtime_error("Property '" + key + "' is not an object, cannot assign nested property");
+ throw Exception(
+ "Property '" + key + "' is not an object, cannot assign nested property",
+ filename_, line_, column_);
}
currMap = &std::get<ObjectMap>(child.get());
}
@@ -83,15 +91,18 @@
const std::string & lastKey = propertyPath_.back();
auto it = currMap->find(lastKey);
if (it == currMap->end()) {
- throw std::runtime_error("Property '" + lastKey + "' not found on object '" + targetName_ + "'");
+ throw Exception(
+ "Property '" + lastKey + "' not found on object '" + targetName_ + "'",
+ filename_, line_, column_);
}
// Type check against existing property
if (newValue.getType() != it->second.getType()) {
using namespace Variables;
- throw std::runtime_error("Type mismatch for property '" + lastKey + "': expected '" +
- TypeToString(it->second.getType()) + "' but got '" +
- TypeToString(newValue.getType()) + "' File: " + filename_ +
- ", Line: " + std::to_string(line_) + ", Column: " + std::to_string(column_));
+ throw Exception(
+ "Type mismatch for property '" + lastKey + "': expected '" +
+ TypeToString(it->second.getType()) + "' but got '" +
+ TypeToString(newValue.getType()) + "'",
+ filename_, line_, column_);
}
// Assign and write back to symbol
(*currMap)[lastKey] = newValue;
--
Gitblit v1.9.3