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