From 370a023e5d920df2c0ab62b691ab9526cd59c6b4 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Thu, 24 Sep 2020 18:36:24 +0200 Subject: [PATCH] Continue types checking at function declaration [ci skip] Seems to work for functions that maps to a single space (not a list) --- src/language/ast/ASTNodeDataTypeBuilder.cpp | 19 +++++++++---------- .../ast/ASTNodeNaturalConversionChecker.cpp | 6 ++++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp index dcde89f1c..58d6d0cf1 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 bb04ffe65..b740faa82 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()}); -- GitLab