diff --git a/src/language/node_processor/AffectationProcessor.hpp b/src/language/node_processor/AffectationProcessor.hpp index 8e30fae597f02a1b000943cc6bf590edef35fd4f..151ede8378622be2a25fc30087091ac72a14047e 100644 --- a/src/language/node_processor/AffectationProcessor.hpp +++ b/src/language/node_processor/AffectationProcessor.hpp @@ -137,8 +137,8 @@ class ComponentAffectationExecutor final : public IAffectationExecutor }()}; public: - ComponentAffectationExecutor(ASTNode& node, ArrayT& lhs_array) - : m_lhs_array{lhs_array}, m_index_expression{*node.children[1]} + ComponentAffectationExecutor(ASTNode& node, ArrayT& lhs_array, ASTNode& index_expression) + : m_lhs_array{lhs_array}, m_index_expression{index_expression} { // LCOV_EXCL_START if constexpr (not _is_defined) { @@ -235,14 +235,17 @@ class AffectationProcessor final : public INodeProcessor const std::string& symbol = array_expression.string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin()); + auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, array_subscript_expression.begin()); Assert(found); DataVariant& value = i_symbol->attributes().value(); if (array_expression.m_data_type != ASTNodeDataType::vector_t) { - throw parse_error("unexpected error: invalid lhs (expecting R^d)", std::vector{node.children[0]->begin()}); + throw parse_error("unexpected error: invalid lhs (expecting R^d)", + std::vector{array_subscript_expression.begin()}); } + auto& index_expression = *array_subscript_expression.children[1]; + switch (array_expression.m_data_type.dimension()) { case 1: { using ArrayTypeT = TinyVector<1>; @@ -250,7 +253,8 @@ class AffectationProcessor final : public INodeProcessor value = ArrayTypeT{}; } using AffectationExecutorT = ComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; - m_affectation_executor = std::make_unique<AffectationExecutorT>(m_node, std::get<ArrayTypeT>(value)); + m_affectation_executor = + std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), index_expression); break; } case 2: { @@ -259,7 +263,8 @@ class AffectationProcessor final : public INodeProcessor value = ArrayTypeT{}; } using AffectationExecutorT = ComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; - m_affectation_executor = std::make_unique<AffectationExecutorT>(m_node, std::get<ArrayTypeT>(value)); + m_affectation_executor = + std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), index_expression); break; } case 3: { @@ -268,11 +273,13 @@ class AffectationProcessor final : public INodeProcessor value = ArrayTypeT{}; } using AffectationExecutorT = ComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; - m_affectation_executor = std::make_unique<AffectationExecutorT>(m_node, std::get<ArrayTypeT>(value)); + m_affectation_executor = + std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), index_expression); break; } default: { - throw parse_error("unexpected error: invalid vector dimension", std::vector{node.children[0]->begin()}); + throw parse_error("unexpected error: invalid vector dimension", + std::vector{array_subscript_expression.begin()}); } }