diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp index dcde89f1c99ef6ad6565ec287475b18aa20c2749..58d6d0cf1e59920fd5f382d61360e0692d726e43 100644 --- a/src/language/ast/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ast/ASTNodeDataTypeBuilder.cpp @@ -166,7 +166,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const n.children[0]->m_data_type = ASTNodeDataType::build<ASTNodeDataType::function_t>(); const std::string& symbol = n.children[0]->string(); - auto [i_symbol, success] = n.m_symbol_table->find(symbol, n.children[0]->begin()); + + auto [i_symbol, success] = n.m_symbol_table->find(symbol, n.children[0]->begin()); auto& function_table = n.m_symbol_table->functionTable(); @@ -283,6 +284,7 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const // LCOV_EXCL_STOP }; +#warning probably useless now if (image_domain_node.is_type<language::type_expression>()) { std::vector<std::shared_ptr<const ASTNodeDataType>> sub_data_type_list; sub_data_type_list.reserve(image_domain_node.children.size()); @@ -298,6 +300,10 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const check_image_type(image_domain_node); } + this->_buildNodeDataTypes(image_expression_node); + + ASTNodeNaturalConversionChecker(image_expression_node, image_domain_node.m_data_type); + n.m_data_type = ASTNodeDataType::build<ASTNodeDataType::void_t>(); return; } else if (n.is_type<language::name>()) { @@ -434,7 +440,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const } } else if (n.is_type<language::function_evaluation>()) { if (n.children[0]->m_data_type == ASTNodeDataType::function_t) { - const std::string& function_name = n.children[0]->string(); + const std::string& function_name = n.children[0]->string(); + auto [i_function_symbol, success] = n.m_symbol_table->find(function_name, n.children[0]->begin()); auto& function_table = n.m_symbol_table->functionTable(); @@ -518,13 +525,5 @@ ASTNodeDataTypeBuilder::ASTNodeDataTypeBuilder(ASTNode& node) this->_buildNodeDataTypes(node); - FunctionTable& function_table = node.m_symbol_table->functionTable(); - for (size_t function_id = 0; function_id < function_table.size(); ++function_id) { - FunctionDescriptor& function_descriptor = function_table[function_id]; - ASTNode& function_expression = function_descriptor.definitionNode(); - - this->_buildNodeDataTypes(function_expression); - } - std::cout << " - build node data types\n"; } diff --git a/src/language/ast/ASTNodeNaturalConversionChecker.cpp b/src/language/ast/ASTNodeNaturalConversionChecker.cpp index bb04ffe65db2ebd5952d047c522b2a457afe54ff..b740faa821c41d55fcd47e2590c21c3512fd71c1 100644 --- a/src/language/ast/ASTNodeNaturalConversionChecker.cpp +++ b/src/language/ast/ASTNodeNaturalConversionChecker.cpp @@ -28,8 +28,10 @@ ASTNodeNaturalConversionChecker::_checkIsNaturalExpressionConversion(const ASTNo const ASTNodeDataType& data_type, const ASTNodeDataType& target_data_type) const { - if (target_data_type == ASTNodeDataType::vector_t) { - switch (data_type) { + if (target_data_type == ASTNodeDataType::typename_t) { + this->_checkIsNaturalExpressionConversion(node, data_type, target_data_type.contentType()); + } else if (target_data_type == ASTNodeDataType::vector_t) { + switch (node.m_data_type) { case ASTNodeDataType::list_t: { if (node.children.size() != target_data_type.dimension()) { throw ParseError("incompatible dimensions in affectation", std::vector{node.begin()});